../ runs index

Campaign a2a-ironclaw-v0.6.2-rc.0-r4 FAIL

Agent group
ironclaw (homogeneous)
ai-memory ref
v0.6.2-rc.0
Completed at
2026-04-21T21:30:16Z
Overall pass
false
Skipped reports
2

Infrastructure

Provider
digitalocean
Region
nyc3
Droplet size
s-2vcpu-4gb
Topology
4-node federation mesh (W=2/N=4)
Scenarios started
2026-04-21T21:21:17Z
Scenarios ended
2026-04-21T21:30:16Z
Dispatched by
alphaonedev
Harness SHA
4c34fb036794
Workflow run
https://github.com/alphaonedev/ai-memory-ai2ai-gate/actions/runs/24746836346

Node roster

#RoleAgent IDPublic IPPrivate IP
1agentai:alice138.197.80.4610.251.0.3
2agentai:bob45.55.52.11910.251.0.4
3agentai:charlie138.197.66.23610.251.0.2
4memory-only134.209.37.18310.251.0.5

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.3.0 — see authoritative baseline.

NodeAgentFrameworkAuthenticMCP ai-memoryxAI cfgxAI defaultAgent IDFederationUFW offiptablesdead-manF1 xAIF2a substrateF2b agent (non-gating)Config SHAPass
node-1ai:aliceironclaw ironclaw 0.26.06c2c081b7f0aPASS
node-2ai:bobironclaw ironclaw 0.26.0b1c24d8fdcf3PASS
node-3ai:charlieironclaw ironclaw 0.26.0aabf14097953PASS
a2a-baseline.json
{
	"baseline_pass": true,
	"per_node": [
		{
			"spec_version": "1.3.0",
			"agent_type": "ironclaw",
			"agent_id": "ai:alice",
			"node_index": "1",
			"framework_version": "ironclaw 0.26.0",
			"ai_memory_version": "0.6.2-rc.0",
			"peer_urls": "http://10.251.0.4:9077,http://10.251.0.2:9077,http://10.251.0.5:9077",
			"config_file_sha256": "6c2c081b7f0a4599f09af0e5447eb27a5eb1148f0eda5e5eb8ccb1c7997aea03",
			"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": true
			},
			"negative_invariants": {
				"_description": "Alternative A2A channels must be OFF so a passing scenario is only passing via ai-memory shared memory. Any true here = thesis-preserving.",
				"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": {
				"xai_grok_chat_reachable": true,
				"xai_grok_sample_reply": "READY",
				"substrate_http_canary_f2a": true,
				"substrate_http_canary_uuid": "8c980fc0-7440-4aee-ad79-5eabe124aab9",
				"agent_mcp_canary_f2b": false,
				"agent_mcp_canary_uuid": "ac7bd215-444f-4eb2-adee-1f924520e7f8",
				"agent_canary_response_head": "",
				"_f2b_note": "F2b is LLM-dependent and non-blocking. F2a (deterministic HTTP substrate) gates baseline_pass.",
				"mesh_connectivity_f4": true,
				"mesh_edges_ok": 3,
				"mesh_edges_total": 3,
				"mesh_edges_detail": "10.251.0.4:9077:OK,10.251.0.2:9077:OK,10.251.0.5:9077:OK",
				"_f4_note": "F4 verifies this local nodes N-1 OUTBOUND mesh edges to every peer via both GET health and POST sync_push dry_run. Aggregator ANDs across N nodes to confirm full N*(N-1) bidirectional reachability. Gates baseline_pass.",
				"ai_memory_mcp_stdio_f5": true,
				"ai_memory_mcp_stdio_init_ok": true,
				"ai_memory_mcp_stdio_tools_ok": true,
				"ai_memory_mcp_stdio_tools_found": "memory_agent_list,memory_agent_register,memory_archive_list,memory_archive_purge,memory_archive_restore,memory_archive_stats,memory_auto_tag,memory_capabilities,memory_consolidate,memory_delete,memory_detect_contradiction,memory_expand_query,memory_forget,memory_gc,memory_get,memory_get_links,memory_inbox,memory_link,memory_list,memory_list_subscriptions,memory_namespace_clear_standard,memory_namespace_get_standard,memory_namespace_set_standard,memory_notify,memory_pending_approve,memory_pending_list,memory_pending_reject,memory_promote,memory_recall,memory_search,memory_session_start,memory_stats,memory_store,memory_subscribe,memory_unsubscribe,memory_update",
				"_f5_note": "F5 spawns the ai-memory stdio MCP subprocess using the framework-configured invocation and verifies initialize + tools/list return memory_store, memory_recall, memory_list. Deterministic (no LLM). Gates baseline_pass.",
				"agent_mcp_ai_memory_canary": true,
				"canary_uuid": "8c980fc0-7440-4aee-ad79-5eabe124aab9",
				"canary_namespace": "_baseline_canary_f2a"
			},
			"baseline_pass": true
		},
		{
			"spec_version": "1.3.0",
			"agent_type": "ironclaw",
			"agent_id": "ai:bob",
			"node_index": "2",
			"framework_version": "ironclaw 0.26.0",
			"ai_memory_version": "0.6.2-rc.0",
			"peer_urls": "http://10.251.0.3:9077,http://10.251.0.2:9077,http://10.251.0.5:9077",
			"config_file_sha256": "b1c24d8fdcf374734f9cb5ab9056703c83883e5cbf9a8b073ab49c8d8f95dc4a",
			"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": true
			},
			"negative_invariants": {
				"_description": "Alternative A2A channels must be OFF so a passing scenario is only passing via ai-memory shared memory. Any true here = thesis-preserving.",
				"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": {
				"xai_grok_chat_reachable": true,
				"xai_grok_sample_reply": "READY",
				"substrate_http_canary_f2a": true,
				"substrate_http_canary_uuid": "04419ce7-b624-4747-90e7-5aff137736b1",
				"agent_mcp_canary_f2b": false,
				"agent_mcp_canary_uuid": "2b2220d9-62f9-4ab5-bdf5-3c89ada20700",
				"agent_canary_response_head": "",
				"_f2b_note": "F2b is LLM-dependent and non-blocking. F2a (deterministic HTTP substrate) gates baseline_pass.",
				"mesh_connectivity_f4": true,
				"mesh_edges_ok": 3,
				"mesh_edges_total": 3,
				"mesh_edges_detail": "10.251.0.3:9077:OK,10.251.0.2:9077:OK,10.251.0.5:9077:OK",
				"_f4_note": "F4 verifies this local nodes N-1 OUTBOUND mesh edges to every peer via both GET health and POST sync_push dry_run. Aggregator ANDs across N nodes to confirm full N*(N-1) bidirectional reachability. Gates baseline_pass.",
				"ai_memory_mcp_stdio_f5": true,
				"ai_memory_mcp_stdio_init_ok": true,
				"ai_memory_mcp_stdio_tools_ok": true,
				"ai_memory_mcp_stdio_tools_found": "memory_agent_list,memory_agent_register,memory_archive_list,memory_archive_purge,memory_archive_restore,memory_archive_stats,memory_auto_tag,memory_capabilities,memory_consolidate,memory_delete,memory_detect_contradiction,memory_expand_query,memory_forget,memory_gc,memory_get,memory_get_links,memory_inbox,memory_link,memory_list,memory_list_subscriptions,memory_namespace_clear_standard,memory_namespace_get_standard,memory_namespace_set_standard,memory_notify,memory_pending_approve,memory_pending_list,memory_pending_reject,memory_promote,memory_recall,memory_search,memory_session_start,memory_stats,memory_store,memory_subscribe,memory_unsubscribe,memory_update",
				"_f5_note": "F5 spawns the ai-memory stdio MCP subprocess using the framework-configured invocation and verifies initialize + tools/list return memory_store, memory_recall, memory_list. Deterministic (no LLM). Gates baseline_pass.",
				"agent_mcp_ai_memory_canary": true,
				"canary_uuid": "04419ce7-b624-4747-90e7-5aff137736b1",
				"canary_namespace": "_baseline_canary_f2a"
			},
			"baseline_pass": true
		},
		{
			"spec_version": "1.3.0",
			"agent_type": "ironclaw",
			"agent_id": "ai:charlie",
			"node_index": "3",
			"framework_version": "ironclaw 0.26.0",
			"ai_memory_version": "0.6.2-rc.0",
			"peer_urls": "http://10.251.0.3:9077,http://10.251.0.4:9077,http://10.251.0.5:9077",
			"config_file_sha256": "aabf14097953878d2202aa9bd9af38aa6a85338a98b4d6abff2a73861b7ee0c0",
			"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": true
			},
			"negative_invariants": {
				"_description": "Alternative A2A channels must be OFF so a passing scenario is only passing via ai-memory shared memory. Any true here = thesis-preserving.",
				"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": {
				"xai_grok_chat_reachable": true,
				"xai_grok_sample_reply": "READY",
				"substrate_http_canary_f2a": true,
				"substrate_http_canary_uuid": "bfad297e-4184-4627-96c4-b1fbf22bed2f",
				"agent_mcp_canary_f2b": false,
				"agent_mcp_canary_uuid": "fad49dde-94bb-4570-9369-b00e25f900ec",
				"agent_canary_response_head": "",
				"_f2b_note": "F2b is LLM-dependent and non-blocking. F2a (deterministic HTTP substrate) gates baseline_pass.",
				"mesh_connectivity_f4": true,
				"mesh_edges_ok": 3,
				"mesh_edges_total": 3,
				"mesh_edges_detail": "10.251.0.3:9077:OK,10.251.0.4:9077:OK,10.251.0.5:9077:OK",
				"_f4_note": "F4 verifies this local nodes N-1 OUTBOUND mesh edges to every peer via both GET health and POST sync_push dry_run. Aggregator ANDs across N nodes to confirm full N*(N-1) bidirectional reachability. Gates baseline_pass.",
				"ai_memory_mcp_stdio_f5": true,
				"ai_memory_mcp_stdio_init_ok": true,
				"ai_memory_mcp_stdio_tools_ok": true,
				"ai_memory_mcp_stdio_tools_found": "memory_agent_list,memory_agent_register,memory_archive_list,memory_archive_purge,memory_archive_restore,memory_archive_stats,memory_auto_tag,memory_capabilities,memory_consolidate,memory_delete,memory_detect_contradiction,memory_expand_query,memory_forget,memory_gc,memory_get,memory_get_links,memory_inbox,memory_link,memory_list,memory_list_subscriptions,memory_namespace_clear_standard,memory_namespace_get_standard,memory_namespace_set_standard,memory_notify,memory_pending_approve,memory_pending_list,memory_pending_reject,memory_promote,memory_recall,memory_search,memory_session_start,memory_stats,memory_store,memory_subscribe,memory_unsubscribe,memory_update",
				"_f5_note": "F5 spawns the ai-memory stdio MCP subprocess using the framework-configured invocation and verifies initialize + tools/list return memory_store, memory_recall, memory_list. Deterministic (no LLM). Gates baseline_pass.",
				"agent_mcp_ai_memory_canary": true,
				"canary_uuid": "bfad297e-4184-4627-96c4-b1fbf22bed2f",
				"canary_namespace": "_baseline_canary_f2a"
			},
			"baseline_pass": true
		}
	]
}

raw file

F3 — peer A2A via shared memory F3 OK

Workflow-level probe answering "can agents communicate through ai-memory?". Writer ai:alice posted canary UUID a25fd1a4-56c5-4f07-9253-c139575306d9 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 agent posts a canary via local ai-memory HTTP on node-1; verifies the row propagates to the 3 peer nodes (W=2/N=4 quorum) before scenarios run.",
	"canary_uuid": "a25fd1a4-56c5-4f07-9253-c139575306d9",
	"canary_namespace": "_baseline_peer_canary",
	"writer_agent": "ai:alice",
	"pass": true
}

raw file

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.

IDTitleResultReason
S1Per-agent write + read (MCP stdio)?
S1bPer-agent write + read (HTTP)PASS
S2Shared-context handoffPASS
S4Federation-aware concurrent writesPASS
S5Consolidation + curationPASS
S6Contradiction detectionPASS
S9Mutation round-tripPASS
S10Deletion propagationPASS
S11Link integrityPASS
S12Agent registration?
S13Concurrent write contentionPASS
S14Partition tolerancePASS
S15Read-your-writesPASS
S16Tier promotionPASS
S17Stats consistencyPASS
S18Semantic query expansion?

Scenario 1 — Per-agent write + read (MCP stdio) UNKNOWN

scenario-1.json (report)

          

raw file

scenario-1.log (console trace)
[scenario-1 ironclaw] phase A: each agent writes 10 memories via MCP
[scenario-1 ironclaw]   agent ai:alice on node-a (138.197.80.46)
unknown AGENT_TYPE: ironclaw

raw file

Scenario 1b — Per-agent write + read (HTTP) PASS

scenario-1b.json (report)
{
	"scenario": "1b",
	"pass": true,
	"agent_group": "ironclaw",
	"path": "serve-http",
	"expected_per_reader": 20,
	"per_agent": {
		"ai:alice": {
			"recall": 20
		},
		"ai:bob": {
			"recall": 20
		},
		"ai:charlie": {
			"recall": 20
		}
	},
	"reasons": []
}

raw file

scenario-1b.log (console trace)
[scenario-1b ironclaw] phase A: each agent POSTs 10 memories to local serve
[scenario-1b ironclaw]   agent ai:alice on node-a (138.197.80.46)
[scenario-1b ironclaw]   agent ai:bob on node-b (45.55.52.119)
[scenario-1b ironclaw]   agent ai:charlie on node-c (138.197.66.236)
[scenario-1b ironclaw] settle 15s for W=2/N=4 convergence
[scenario-1b ironclaw] phase B: each reader counts rows in the OTHER two namespaces via local serve
[scenario-1b ironclaw]   ai:alice sees 20 rows from the other two namespaces
[scenario-1b ironclaw]   ai:bob sees 20 rows from the other two namespaces
[scenario-1b ironclaw]   ai:charlie sees 20 rows from the other two namespaces
[scenario-1b ironclaw] phase C: cross-cluster identity verification via node-4
[scenario-1b ironclaw]   ns=scenario1b-ai:alice count=10 wrong_agent_id=0
[scenario-1b ironclaw]   ns=scenario1b-ai:bob count=10 wrong_agent_id=0
[scenario-1b ironclaw]   ns=scenario1b-ai:charlie count=10 wrong_agent_id=0

raw file

Scenario 2 — Shared-context handoff PASS

scenario-2.json (report)
{
	"scenario": "2",
	"pass": true,
	"agent_group": "ironclaw",
	"path": "serve-http",
	"per_agent": {
		"ai:bob": {
			"sees_handoff": 1
		},
		"ai:alice": {
			"sees_ack": 1
		}
	},
	"handoff_uuid": "143df795-d2dd-4ee8-bfec-4c5b1d61d93f",
	"ack_uuid": "c87a29f1-69b1-40df-bb28-f3e9d8cc2ae9",
	"reasons": []
}

raw file

scenario-2.log (console trace)
[scenario-2 ironclaw] phase A: ai:alice writes handoff to ai:bob (uuid=143df795-d2dd-4ee8-bfec-4c5b1d61d93f)
[scenario-2 ironclaw] settle 8s for quorum fanout
[scenario-2 ironclaw] phase B: ai:bob reads handoff on node-2
[scenario-2 ironclaw]   ai:bob sees 1 handoff memories from ai:alice
[scenario-2 ironclaw] phase C: ai:bob writes acknowledgement (uuid=c87a29f1-69b1-40df-bb28-f3e9d8cc2ae9)
[scenario-2 ironclaw] settle 8s for reverse-direction fanout
[scenario-2 ironclaw] phase D: ai:alice reads ack on node-1
[scenario-2 ironclaw]   ai:alice sees 1 ack memories from ai:bob

raw file

Scenario 4 — Federation-aware concurrent writes PASS

scenario-4.json (report)
{
	"scenario": "4",
	"pass": true,
	"agent_group": "ironclaw",
	"expected_per_agent": 30,
	"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": []
}

raw file

scenario-4.log (console trace)
[scenario-4 ironclaw] phase A: launching concurrent 30-row bursts from 3 agents
[scenario-4 ironclaw] all 3 bursts complete; settle 20s for W=2 fanout convergence
[scenario-4 ironclaw] phase B: querying node-4 aggregator for per-agent counts
[scenario-4 ironclaw]   ai:alice: count=30 (expected 30) wrong_agent_id=0
[scenario-4 ironclaw]   ai:bob: count=30 (expected 30) wrong_agent_id=0
[scenario-4 ironclaw]   ai:charlie: count=30 (expected 30) wrong_agent_id=0

raw file

Scenario 5 — Consolidation + curation PASS

scenario-5.json (report)
{
	"scenario": "5",
	"pass": true,
	"agent_group": "ironclaw",
	"consolidated_id": "aa42b666-9a3a-41fc-881f-93e8f9179cee",
	"consolidate_http_code": "201",
	"consolidated_from_agents": "[\"ai:charlie\",\"ai:bob\",\"ai:alice\"]",
	"reasons": []
}

raw file

scenario-5.log (console trace)
[scenario-5 ironclaw] phase A: each agent writes 3 related memories
[scenario-5 ironclaw]   ai:alice on 138.197.80.46
[scenario-5 ironclaw]   ai:bob on 45.55.52.119
[scenario-5 ironclaw]   ai:charlie on 138.197.66.236
[scenario-5 ironclaw] phase B: collect source memory IDs on node-1, then trigger consolidate
[scenario-5 ironclaw]   source ids: ["cbe100e8-4752-4c94-a2b6-a7bbf0ab38bc","fb805a44-9551-4ecf-9e9d-b97d7578a0bf","1b274f6e-b061-4e29-bc66-c18bcbb7a45d","dcce036f-01e6-4f86-ba57-4601dd06fbb7","ce9366bb-b935-4cbf-a063-e67f5afb11b3","abf319ce-af15-43ec-8cc7-00067b410429","3d065ee6-bef4-4a29-a34c-275d1149d288","117213cd-2cdc-4e88-86c9-6217936cee1c","b6b9ff8b-bd33-4200-acc8-c49b0fa3889a"]
[scenario-5 ironclaw]   consolidate returned HTTP 201
[scenario-5 ironclaw]   consolidated memory id=aa42b666-9a3a-41fc-881f-93e8f9179cee
[scenario-5 ironclaw] phase C: verifying consolidated_from_agents on node-4
[scenario-5 ironclaw]   consolidated_from_agents=["ai:charlie","ai:bob","ai:alice"]

raw file

Scenario 6 — Contradiction detection PASS

scenario-6.json (report)
{
	"scenario": "6",
	"pass": true,
	"agent_group": "ironclaw",
	"topic": "sky-color-fef4114f",
	"alice_id": "7eb417da-27e0-4d61-bdf0-b71780a05c83",
	"bob_id": "0b46e6a1-bf2c-47ca-96c2-5b3d41b4c2f1",
	"detect_http_code": "200",
	"charlie_sees_both_memories": 1,
	"charlie_sees_contradicts_link": 1,
	"reasons": []
}

raw file

scenario-6.log (console trace)
[scenario-6 ironclaw] alice writes claim: "sky-color-fef4114f is blue" on node-1
[scenario-6 ironclaw] bob writes contradicting claim: "sky-color-fef4114f is red" on node-2
[scenario-6 ironclaw]   alice.id=7eb417da-27e0-4d61-bdf0-b71780a05c83 bob.id=0b46e6a1-bf2c-47ca-96c2-5b3d41b4c2f1
[scenario-6 ironclaw] charlie queries memory_detect_contradiction on node-3
[scenario-6 ironclaw]   HTTP 200; body length=1117
[scenario-6 ironclaw]   sees both memories: 1; sees contradicts link: 1

raw file

Scenario 9 — Mutation round-trip PASS

scenario-9.json (report)
{
	"scenario": "9",
	"pass": true,
	"agent_group": "ironclaw",
	"m1_id": "7c721f89-cde9-4ea8-bfcf-06bcf82d9588",
	"v1_uuid": "5e46c314-6b96-4fdf-84ec-321dfc9fdc61",
	"v2_uuid": "5af1fbef-3d45-44d7-a6db-57e967b39643",
	"put_http_code": "200",
	"charlie_view": {
		"content": "5af1fbef-3d45-44d7-a6db-57e967b39643",
		"agent_id": "ai:alice"
	},
	"reasons": []
}

raw file

scenario-9.log (console trace)
[scenario-9 ironclaw] alice writes M1 content=5e46c314-6b96-4fdf-84ec-321dfc9fdc61 on node-1
[scenario-9 ironclaw]   created memory id=7c721f89-cde9-4ea8-bfcf-06bcf82d9588
[scenario-9 ironclaw] bob updates M1 content=5af1fbef-3d45-44d7-a6db-57e967b39643 on node-2 via PUT
[scenario-9 ironclaw]   PUT returned HTTP 200
[scenario-9 ironclaw] charlie reads M1 on node-3 and checks content + provenance
[scenario-9 ironclaw]   charlie sees content="5af1fbef-3d45-44d7-a6db-57e967b39643" agent_id="ai:alice"

raw file

Scenario 10 — Deletion propagation PASS

scenario-10.json (report)
{
	"scenario": "10",
	"pass": true,
	"agent_group": "ironclaw",
	"m1_id": "dc68a4a2-84ce-42e4-b66a-eeb5493b0a35",
	"uuid": "7668a290-2236-4d29-b79a-4d8a6e9f07e7",
	"delete_http_code": "200",
	"pre_delete_visible_peers": 3,
	"post_delete_still_visible_peers": 0,
	"reasons": []
}

raw file

scenario-10.log (console trace)
[scenario-10 ironclaw] alice writes M1 content=7668a290-2236-4d29-b79a-4d8a6e9f07e7 on node-1
[scenario-10 ironclaw]   created memory id=dc68a4a2-84ce-42e4-b66a-eeb5493b0a35
[scenario-10 ironclaw] pre-delete: verifying M1 is visible on all peers
[scenario-10 ironclaw]   pre-delete node-2 sees 1
[scenario-10 ironclaw]   pre-delete node-3 sees 1
[scenario-10 ironclaw]   pre-delete node-4 sees 1
[scenario-10 ironclaw] alice deletes M1 on node-1
[scenario-10 ironclaw]   DELETE returned HTTP 200
[scenario-10 ironclaw] post-delete: verifying M1 is GONE from all peers
[scenario-10 ironclaw]   post-delete node-2 sees 0 (expected 0)
[scenario-10 ironclaw]   post-delete node-3 sees 0 (expected 0)
[scenario-10 ironclaw]   post-delete node-4 sees 0 (expected 0)

raw file

Scenario 11 — Link integrity PASS

scenario-11.json (report)
{
	"scenario": "11",
	"pass": true,
	"agent_group": "ironclaw",
	"m1_id": "08d46ce1-5896-4afc-8c61-b12fa9dc0468",
	"m2_id": "b2b7a8e0-a61f-4bd5-9e0b-09eb6c02a11c",
	"relation": "related_to",
	"link_http_code": "201",
	"charlie_sees_link": 1,
	"reasons": []
}

raw file

scenario-11.log (console trace)
[scenario-11 ironclaw] alice writes M1 on node-1
[scenario-11 ironclaw] bob writes M2 on node-2
[scenario-11 ironclaw]   M1=08d46ce1-5896-4afc-8c61-b12fa9dc0468 M2=b2b7a8e0-a61f-4bd5-9e0b-09eb6c02a11c
[scenario-11 ironclaw] alice links M1 -> M2 with relation=related_to
[scenario-11 ironclaw]   link POST returned HTTP 201
[scenario-11 ironclaw] charlie queries links of M1 on node-3
[scenario-11 ironclaw]   charlie sees M1->M2 link: 1 (expected >=1)

raw file

Scenario 12 — Agent registration UNKNOWN

scenario-12.json (report)

          

raw file

scenario-12.log (console trace)
[scenario-12 ironclaw] alice registers new agent ai:dave-probe-66e4cb04 on node-1
[scenario-12 ironclaw]   POST /api/v1/agents returned HTTP 422

raw file

Scenario 13 — Concurrent write contention PASS

scenario-13.json (report)
{
	"scenario": "13",
	"pass": true,
	"agent_group": "ironclaw",
	"m1_id": "03b432e6-da24-47d1-939c-e8001add85b3",
	"submitted": {
		"v0": "6dcf7774-cc22-4e80-8bb5-0f40895a4983",
		"vA_alice": "bf722001-ce97-43f2-970c-cb19d2a0fa4a",
		"vB_bob": "08990d70-fddb-463c-8dc7-4faa5379d447"
	},
	"peer_view": {
		"node_1": "08990d70-fddb-463c-8dc7-4faa5379d447",
		"node_2": "08990d70-fddb-463c-8dc7-4faa5379d447",
		"node_3": "08990d70-fddb-463c-8dc7-4faa5379d447",
		"node_4": "08990d70-fddb-463c-8dc7-4faa5379d447"
	},
	"reasons": []
}

raw file

scenario-13.log (console trace)
[scenario-13 ironclaw] alice writes M1 content=v0 on node-1
[scenario-13 ironclaw]   M1 id=03b432e6-da24-47d1-939c-e8001add85b3
[scenario-13 ironclaw] alice + bob issue concurrent PUTs (vA=bf722001-ce97-43f2-970c-cb19d2a0fa4a from alice, vB=08990d70-fddb-463c-8dc7-4faa5379d447 from bob)
[scenario-13 ironclaw] settle 10s for quorum convergence
[scenario-13 ironclaw]   node-1 sees content=08990d70-fddb-463c-8dc7-4faa5379d447
[scenario-13 ironclaw]   node-2 sees content=08990d70-fddb-463c-8dc7-4faa5379d447
[scenario-13 ironclaw]   node-3 sees content=08990d70-fddb-463c-8dc7-4faa5379d447
[scenario-13 ironclaw]   node-4 sees content=08990d70-fddb-463c-8dc7-4faa5379d447

raw file

Scenario 14 — Partition tolerance PASS

scenario-14.json (report)
{
	"scenario": "14",
	"pass": true,
	"agent_group": "ironclaw",
	"partition_target": "node-3",
	"expected_post_recovery": 20,
	"node3_saw": 20,
	"reasons": []
}

raw file

scenario-14.log (console trace)
[scenario-14 ironclaw] suspending ai-memory on node-3 (SIGSTOP)
[scenario-14 ironclaw] writing 10 memories each from alice + bob during node-3 outage
[scenario-14 ironclaw] resuming ai-memory on node-3 (SIGCONT)
[scenario-14 ironclaw] settle 20s for post-partition catchup
[scenario-14 ironclaw] checking node-3 caught up
[scenario-14 ironclaw]   node-3 sees 20 memories in scenario14-partition (expected 20)

raw file

Scenario 15 — Read-your-writes PASS

scenario-15.json (report)
{
	"scenario": "15",
	"pass": true,
	"agent_group": "ironclaw",
	"uuid": "d7893797-d130-4f08-b3e4-62868204090f",
	"writer_sees_own_write": 1,
	"reasons": []
}

raw file

scenario-15.log (console trace)
[scenario-15 ironclaw] alice writes + immediately reads M1 on node-1 (uuid=d7893797-d130-4f08-b3e4-62868204090f)
[scenario-15 ironclaw]   alice sees 1 (expected 1) immediately after write

raw file

Scenario 16 — Tier promotion PASS

scenario-16.json (report)
{
	"scenario": "16",
	"pass": true,
	"agent_group": "ironclaw",
	"m1_id": "8b8d3efb-cb30-4844-b8dd-061236598959",
	"promote_http_code": "200",
	"bob_sees_tier": "long",
	"reasons": []
}

raw file

scenario-16.log (console trace)
[scenario-16 ironclaw] alice writes M1 tier=short on node-1
[scenario-16 ironclaw]   M1 id=8b8d3efb-cb30-4844-b8dd-061236598959
[scenario-16 ironclaw] alice promotes M1 to tier=long
[scenario-16 ironclaw]   promote returned HTTP 200
[scenario-16 ironclaw] bob reads M1 on node-2 and checks tier
[scenario-16 ironclaw]   bob sees tier=long (expected long)

raw file

Scenario 17 — Stats consistency PASS

scenario-17.json (report)
{
	"scenario": "17",
	"pass": true,
	"agent_group": "ironclaw",
	"expected_count": 15,
	"per_peer": {
		"node_1": 15,
		"node_2": 15,
		"node_3": 15,
		"node_4": 15
	},
	"reasons": []
}

raw file

scenario-17.log (console trace)
[scenario-17 ironclaw] phase A: each of 3 agents writes 5 memories to scenario17-stats
[scenario-17 ironclaw]   ai:alice on 138.197.80.46
[scenario-17 ironclaw]   ai:bob on 45.55.52.119
[scenario-17 ironclaw]   ai:charlie on 138.197.66.236
[scenario-17 ironclaw] settle 15s for W=2 fanout
[scenario-17 ironclaw] phase B: querying count on every peer
[scenario-17 ironclaw]   node-1 count=15 (expected 15)
[scenario-17 ironclaw]   node-2 count=15 (expected 15)
[scenario-17 ironclaw]   node-3 count=15 (expected 15)
[scenario-17 ironclaw]   node-4 count=15 (expected 15)

raw file

Scenario 18 — Semantic query expansion FAIL

Reasons: semantic query did not surface alice's memory | semantic query did not surface bob's memory

scenario-18.json (report)
{
	"scenario": "18",
	"pass": false,
	"agent_group": "ironclaw",
	"query": "morning outdoor exercise routine",
	"writers": [
		{
			"agent": "ai:alice",
			"marker": "alice-sunrise-a409336a-dfa7-4d98-8a55-f62d3d42e335",
			"seen_by_charlie": 0
		},
		{
			"agent": "ai:bob",
			"marker": "bob-daybreak-b2885bd8-406d-41d6-b0c6-5416ec3e6616",
			"seen_by_charlie": 0
		}
	],
	"reasons": [
		"semantic query did not surface alice's memory",
		"semantic query did not surface bob's memory"
	]
}

raw file

scenario-18.log (console trace)
[scenario-18 ironclaw] alice writes A on node-1
[scenario-18 ironclaw] bob writes B on node-2
[scenario-18 ironclaw] settle 15s for fanout + index rebuild
[scenario-18 ironclaw] charlie queries on node-3 with semantically-related prompt
[scenario-18 ironclaw]   charlie sees alice's memory: 0 (expected >=1)
[scenario-18 ironclaw]   charlie sees bob's memory: 0 (expected >=1)

raw file

All artifacts