Campaign a2a-hermes-v0.6.1-r16 FAIL
Infrastructure
Node roster
| # | Role | Agent ID | Public IP | Private IP |
|---|---|---|---|---|
| 1 | agent | ai:alice | 45.55.136.51 | 10.252.0.3 |
| 2 | agent | ai:bob | 165.227.101.0 | 10.252.0.2 |
| 3 | agent | ai:charlie | 143.198.31.2 | 10.252.0.5 |
| 4 | memory-only | — | 165.227.191.214 | 10.252.0.4 |
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.2.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 | hermes Hermes Agent v0.10.0 (2026.4.16) | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | — | fa358f9a9059 | PASS |
| node-2 | ai:bob | hermes Hermes Agent v0.10.0 (2026.4.16) | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | — | 21635cf63640 | PASS |
| node-3 | ai:charlie | hermes Hermes Agent v0.10.0 (2026.4.16) | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | — | ce52d772ef5a | PASS |
a2a-baseline.json
{
"baseline_pass": true,
"per_node": [
{
"spec_version": "1.2.0",
"agent_type": "hermes",
"agent_id": "ai:alice",
"node_index": "1",
"framework_version": "Hermes Agent v0.10.0 (2026.4.16)",
"ai_memory_version": "0.6.1",
"peer_urls": "http://10.252.0.2:9077,http://10.252.0.5:9077,http://10.252.0.4:9077",
"config_file_sha256": "fa358f9a90597243fb96224babd541399bd7b1e972f364605308ab1e2d9dd2c7",
"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": "Imustdeclinethisrequestasitappearstobe",
"substrate_http_canary_f2a": true,
"substrate_http_canary_uuid": "6f42f6c7-931b-4c1e-a61e-f57da9044fd1",
"agent_mcp_canary_f2b": false,
"agent_mcp_canary_uuid": "9c53eed0-5e1e-4889-895b-84f9d59ecef8",
"agent_canary_response_head": "Traceback (most recent call last): File \"/usr/local/bin/hermes\", line 11, in <module> main() File \"/root/.hermes/hermes-agent/hermes_cli/main.py\", line 8679, in main args.func(args) File \"/root/.hermes/hermes-agent/hermes_cli/main.py\", line 1083, in cmd_chat if not _has_any_provider_configured(): ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File \"/root/.hermes/hermes-agent/hermes_cli/main.py\", line 222, in _has_any_provider_configured from hermes_cli.auth import get_auth_sta",
"_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.252.0.2:9077:OK,10.252.0.5:9077:OK,10.252.0.4: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.",
"agent_mcp_ai_memory_canary": true,
"canary_uuid": "6f42f6c7-931b-4c1e-a61e-f57da9044fd1",
"canary_namespace": "_baseline_canary_f2a"
},
"baseline_pass": true
},
{
"spec_version": "1.2.0",
"agent_type": "hermes",
"agent_id": "ai:bob",
"node_index": "2",
"framework_version": "Hermes Agent v0.10.0 (2026.4.16)",
"ai_memory_version": "0.6.1",
"peer_urls": "http://10.252.0.3:9077,http://10.252.0.5:9077,http://10.252.0.4:9077",
"config_file_sha256": "21635cf6364057fd2a004d28aac89abf8438671d85f9fd2ed1e654d812d23ff1",
"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": "9ebcc76e-18d4-4a86-9ce2-fe053879631b",
"agent_mcp_canary_f2b": false,
"agent_mcp_canary_uuid": "7a8c26d7-1062-4ec9-b076-652ee15f0059",
"agent_canary_response_head": "Traceback (most recent call last): File \"/usr/local/bin/hermes\", line 11, in <module> main() File \"/root/.hermes/hermes-agent/hermes_cli/main.py\", line 8679, in main args.func(args) File \"/root/.hermes/hermes-agent/hermes_cli/main.py\", line 1083, in cmd_chat if not _has_any_provider_configured(): ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File \"/root/.hermes/hermes-agent/hermes_cli/main.py\", line 222, in _has_any_provider_configured from hermes_cli.auth import get_auth_sta",
"_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.252.0.3:9077:OK,10.252.0.5:9077:OK,10.252.0.4: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.",
"agent_mcp_ai_memory_canary": true,
"canary_uuid": "9ebcc76e-18d4-4a86-9ce2-fe053879631b",
"canary_namespace": "_baseline_canary_f2a"
},
"baseline_pass": true
},
{
"spec_version": "1.2.0",
"agent_type": "hermes",
"agent_id": "ai:charlie",
"node_index": "3",
"framework_version": "Hermes Agent v0.10.0 (2026.4.16)",
"ai_memory_version": "0.6.1",
"peer_urls": "http://10.252.0.3:9077,http://10.252.0.2:9077,http://10.252.0.4:9077",
"config_file_sha256": "ce52d772ef5a00968db29fb80eea7a14206b0a258a00ff2165db725405474618",
"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": "9897fcb3-acd4-41a6-bac2-af51ab6082d1",
"agent_mcp_canary_f2b": false,
"agent_mcp_canary_uuid": "29a55346-a64a-4e9a-8863-d23e87e82121",
"agent_canary_response_head": "Traceback (most recent call last): File \"/usr/local/bin/hermes\", line 11, in <module> main() File \"/root/.hermes/hermes-agent/hermes_cli/main.py\", line 8679, in main args.func(args) File \"/root/.hermes/hermes-agent/hermes_cli/main.py\", line 1083, in cmd_chat if not _has_any_provider_configured(): ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File \"/root/.hermes/hermes-agent/hermes_cli/main.py\", line 222, in _has_any_provider_configured from hermes_cli.auth import get_auth_sta",
"_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.252.0.3:9077:OK,10.252.0.2:9077:OK,10.252.0.4: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.",
"agent_mcp_ai_memory_canary": true,
"canary_uuid": "9897fcb3-acd4-41a6-bac2-af51ab6082d1",
"canary_namespace": "_baseline_canary_f2a"
},
"baseline_pass": true
}
]
}
F3 — peer A2A via shared memory F3 OK
Workflow-level probe answering "can agents communicate through ai-memory?". Writer ai:alice posted canary UUID 4fb3ca99-23f5-4ed9-be8f-931fa5d5fa7d 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": "4fb3ca99-23f5-4ed9-be8f-931fa5d5fa7d",
"canary_namespace": "_baseline_peer_canary",
"writer_agent": "ai:alice",
"pass": true
}
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) | ? | |
| 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 | ? | |
| S12 | Agent registration | ? | |
| 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 | ? |
Scenario 1 — Per-agent write + read (MCP stdio) UNKNOWN
scenario-1.json (report)
scenario-1.log (console trace)
[scenario-1 hermes] phase A: each agent writes 10 memories via MCP
[scenario-1 hermes] agent ai:alice on node-a (45.55.136.51)
Traceback (most recent call last):
File "/usr/local/bin/hermes", line 11, in <module>
main()
File "/root/.hermes/hermes-agent/hermes_cli/main.py", line 8679, in main
args.func(args)
File "/root/.hermes/hermes-agent/hermes_cli/main.py", line 1083, in cmd_chat
if not _has_any_provider_configured():
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/root/.hermes/hermes-agent/hermes_cli/main.py", line 222, in _has_any_provider_configured
from hermes_cli.auth import get_auth_status
File "/root/.hermes/hermes-agent/hermes_cli/auth.py", line 38, in <module>
import httpx
ModuleNotFoundError: No module named 'httpx'
Scenario 1b — Per-agent write + read (HTTP) PASS
scenario-1b.json (report)
{
"scenario": "1b",
"pass": true,
"agent_group": "hermes",
"path": "serve-http",
"expected_per_reader": 20,
"per_agent": {
"ai:alice": {
"recall": 20
},
"ai:bob": {
"recall": 20
},
"ai:charlie": {
"recall": 20
}
},
"reasons": []
}
scenario-1b.log (console trace)
[scenario-1b hermes] phase A: each agent POSTs 10 memories to local serve [scenario-1b hermes] agent ai:alice on node-a (45.55.136.51) [scenario-1b hermes] agent ai:bob on node-b (165.227.101.0) [scenario-1b hermes] agent ai:charlie on node-c (143.198.31.2) [scenario-1b hermes] settle 15s for W=2/N=4 convergence [scenario-1b hermes] phase B: each reader counts rows in the OTHER two namespaces via local serve [scenario-1b hermes] ai:alice sees 20 rows from the other two namespaces [scenario-1b hermes] ai:bob sees 20 rows from the other two namespaces [scenario-1b hermes] ai:charlie sees 20 rows from the other two namespaces [scenario-1b hermes] phase C: cross-cluster identity verification via node-4 [scenario-1b hermes] ns=scenario1b-ai:alice count=10 wrong_agent_id=0 [scenario-1b hermes] ns=scenario1b-ai:bob count=10 wrong_agent_id=0 [scenario-1b hermes] ns=scenario1b-ai:charlie count=10 wrong_agent_id=0
Scenario 2 — Shared-context handoff PASS
scenario-2.json (report)
{
"scenario": "2",
"pass": true,
"agent_group": "hermes",
"path": "serve-http",
"per_agent": {
"ai:bob": {
"sees_handoff": 1
},
"ai:alice": {
"sees_ack": 1
}
},
"handoff_uuid": "8fc9b3dd-5ee0-42b9-af34-a489a5e7c769",
"ack_uuid": "fa41fefb-5f19-4256-8de8-0d350928b7ed",
"reasons": []
}
scenario-2.log (console trace)
[scenario-2 hermes] phase A: ai:alice writes handoff to ai:bob (uuid=8fc9b3dd-5ee0-42b9-af34-a489a5e7c769) [scenario-2 hermes] settle 8s for quorum fanout [scenario-2 hermes] phase B: ai:bob reads handoff on node-2 [scenario-2 hermes] ai:bob sees 1 handoff memories from ai:alice [scenario-2 hermes] phase C: ai:bob writes acknowledgement (uuid=fa41fefb-5f19-4256-8de8-0d350928b7ed) [scenario-2 hermes] settle 8s for reverse-direction fanout [scenario-2 hermes] phase D: ai:alice reads ack on node-1 [scenario-2 hermes] ai:alice sees 1 ack memories from ai:bob
Scenario 4 — Federation-aware concurrent writes PASS
scenario-4.json (report)
{
"scenario": "4",
"pass": true,
"agent_group": "hermes",
"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": []
}
scenario-4.log (console trace)
[scenario-4 hermes] phase A: launching concurrent 30-row bursts from 3 agents [scenario-4 hermes] all 3 bursts complete; settle 20s for W=2 fanout convergence [scenario-4 hermes] phase B: querying node-4 aggregator for per-agent counts [scenario-4 hermes] ai:alice: count=30 (expected 30) wrong_agent_id=0 [scenario-4 hermes] ai:bob: count=30 (expected 30) wrong_agent_id=0 [scenario-4 hermes] ai:charlie: count=30 (expected 30) wrong_agent_id=0
Scenario 5 — Consolidation + curation PASS
scenario-5.json (report)
{
"scenario": "5",
"pass": true,
"agent_group": "hermes",
"consolidated_id": "55cba3dd-21d4-4e9b-b56d-995bd23be3df",
"consolidate_http_code": "201",
"consolidated_from_agents": "[\"ai:charlie\",\"ai:bob\",\"ai:alice\"]",
"reasons": []
}
scenario-5.log (console trace)
[scenario-5 hermes] phase A: each agent writes 3 related memories [scenario-5 hermes] ai:alice on 45.55.136.51 [scenario-5 hermes] ai:bob on 165.227.101.0 [scenario-5 hermes] ai:charlie on 143.198.31.2 [scenario-5 hermes] phase B: collect source memory IDs on node-1, then trigger consolidate [scenario-5 hermes] source ids: ["43c854fe-6d2b-41cd-a8ba-0bfefb1a8703","4667e5c4-e574-46d3-9651-23698abe47de","9dfc0ec7-9543-4047-a1df-d89f8240841e","ef041825-db43-48e0-b2de-55d8404b4ab9","feb01b98-c2d2-4f3d-9386-28cfeece6e5c","636261f9-8b49-47f5-a80d-f2b1fb508538","d73415e6-040a-4793-bb5f-bab166e3eeed","f34e685b-3626-4cee-aa1b-1996cedf72da","71500484-13bf-4775-8cda-b7dcc3d3dbb0"] [scenario-5 hermes] consolidate returned HTTP 201 [scenario-5 hermes] consolidated memory id=55cba3dd-21d4-4e9b-b56d-995bd23be3df [scenario-5 hermes] phase C: verifying consolidated_from_agents on node-4 [scenario-5 hermes] consolidated_from_agents=["ai:charlie","ai:bob","ai:alice"]
Scenario 6 — Contradiction detection PASS
scenario-6.json (report)
{
"scenario": "6",
"pass": true,
"agent_group": "hermes",
"topic": "sky-color-6bc88509",
"alice_id": "200d1875-d926-45ea-8710-489aef9b09d4",
"bob_id": "1c3af1d4-62ad-49ba-8f78-699321178596",
"detect_http_code": "200",
"charlie_sees_both_memories": 1,
"charlie_sees_contradicts_link": 1,
"reasons": []
}
scenario-6.log (console trace)
[scenario-6 hermes] alice writes claim: "sky-color-6bc88509 is blue" on node-1 [scenario-6 hermes] bob writes contradicting claim: "sky-color-6bc88509 is red" on node-2 [scenario-6 hermes] alice.id=200d1875-d926-45ea-8710-489aef9b09d4 bob.id=1c3af1d4-62ad-49ba-8f78-699321178596 [scenario-6 hermes] charlie queries memory_detect_contradiction on node-3 [scenario-6 hermes] HTTP 200; body length=1117 [scenario-6 hermes] sees both memories: 1; sees contradicts link: 1
Scenario 9 — Mutation round-trip PASS
scenario-9.json (report)
{
"scenario": "9",
"pass": true,
"agent_group": "hermes",
"m1_id": "f8ed7aa1-ba60-4e1a-88c5-eee429ce158d",
"v1_uuid": "d21dd521-a2df-460e-a3bc-f3112cc93506",
"v2_uuid": "69d5f9f7-0aef-4b99-9704-c66e1f490793",
"put_http_code": "200",
"charlie_view": {
"content": "69d5f9f7-0aef-4b99-9704-c66e1f490793",
"agent_id": "ai:alice"
},
"reasons": []
}
scenario-9.log (console trace)
[scenario-9 hermes] alice writes M1 content=d21dd521-a2df-460e-a3bc-f3112cc93506 on node-1 [scenario-9 hermes] created memory id=f8ed7aa1-ba60-4e1a-88c5-eee429ce158d [scenario-9 hermes] bob updates M1 content=69d5f9f7-0aef-4b99-9704-c66e1f490793 on node-2 via PUT [scenario-9 hermes] PUT returned HTTP 200 [scenario-9 hermes] charlie reads M1 on node-3 and checks content + provenance [scenario-9 hermes] charlie sees content="69d5f9f7-0aef-4b99-9704-c66e1f490793" agent_id="ai:alice"
Scenario 10 — Deletion propagation PASS
scenario-10.json (report)
{
"scenario": "10",
"pass": true,
"agent_group": "hermes",
"m1_id": "a8416a30-d7f4-420c-bed4-8d744242b7f8",
"uuid": "60e3a644-b1e4-4e18-99ad-119ae062b648",
"delete_http_code": "200",
"pre_delete_visible_peers": 3,
"post_delete_still_visible_peers": 0,
"reasons": []
}
scenario-10.log (console trace)
[scenario-10 hermes] alice writes M1 content=60e3a644-b1e4-4e18-99ad-119ae062b648 on node-1 [scenario-10 hermes] created memory id=a8416a30-d7f4-420c-bed4-8d744242b7f8 [scenario-10 hermes] pre-delete: verifying M1 is visible on all peers [scenario-10 hermes] pre-delete node-2 sees 1 [scenario-10 hermes] pre-delete node-3 sees 1 [scenario-10 hermes] pre-delete node-4 sees 1 [scenario-10 hermes] alice deletes M1 on node-1 [scenario-10 hermes] DELETE returned HTTP 200 [scenario-10 hermes] post-delete: verifying M1 is GONE from all peers [scenario-10 hermes] post-delete node-2 sees 0 (expected 0) [scenario-10 hermes] post-delete node-3 sees 0 (expected 0) [scenario-10 hermes] post-delete node-4 sees 0 (expected 0)
Scenario 11 — Link integrity FAIL
Reasons: charlie could not see M1->M2 link after settle
scenario-11.json (report)
{
"scenario": "11",
"pass": false,
"agent_group": "hermes",
"m1_id": "30da1735-9a47-4690-bc4d-4d6548fb4b97",
"m2_id": "de6b77b9-9197-403e-942f-16514d939f42",
"relation": "related_to",
"link_http_code": "201",
"charlie_sees_link": 0,
"reasons": [
"charlie could not see M1->M2 link after settle"
]
}
scenario-11.log (console trace)
[scenario-11 hermes] alice writes M1 on node-1 [scenario-11 hermes] bob writes M2 on node-2 [scenario-11 hermes] M1=30da1735-9a47-4690-bc4d-4d6548fb4b97 M2=de6b77b9-9197-403e-942f-16514d939f42 [scenario-11 hermes] alice links M1 -> M2 with relation=related_to [scenario-11 hermes] link POST returned HTTP 201 [scenario-11 hermes] charlie queries links of M1 on node-3 [scenario-11 hermes] charlie sees M1->M2 link: 0 (expected >=1)
Scenario 12 — Agent registration UNKNOWN
scenario-12.json (report)
scenario-12.log (console trace)
[scenario-12 hermes] alice registers new agent ai:dave-probe-b623daf4 on node-1 [scenario-12 hermes] POST /api/v1/agents returned HTTP 422
Scenario 13 — Concurrent write contention PASS
scenario-13.json (report)
{
"scenario": "13",
"pass": true,
"agent_group": "hermes",
"m1_id": "c7fea25f-da2f-4c7d-94ad-098f0c78f897",
"submitted": {
"v0": "b5f59556-8449-4cfc-9dd7-4b937eef91d7",
"vA_alice": "705e1fc9-4ce6-4fd8-9923-b1e3d2f6b1ff",
"vB_bob": "9c988d5d-4b8f-4812-aa92-0eb47f751f0b"
},
"peer_view": {
"node_1": "9c988d5d-4b8f-4812-aa92-0eb47f751f0b",
"node_2": "9c988d5d-4b8f-4812-aa92-0eb47f751f0b",
"node_3": "9c988d5d-4b8f-4812-aa92-0eb47f751f0b",
"node_4": "9c988d5d-4b8f-4812-aa92-0eb47f751f0b"
},
"reasons": []
}
scenario-13.log (console trace)
[scenario-13 hermes] alice writes M1 content=v0 on node-1 [scenario-13 hermes] M1 id=c7fea25f-da2f-4c7d-94ad-098f0c78f897 [scenario-13 hermes] alice + bob issue concurrent PUTs (vA=705e1fc9-4ce6-4fd8-9923-b1e3d2f6b1ff from alice, vB=9c988d5d-4b8f-4812-aa92-0eb47f751f0b from bob) [scenario-13 hermes] settle 10s for quorum convergence [scenario-13 hermes] node-1 sees content=9c988d5d-4b8f-4812-aa92-0eb47f751f0b [scenario-13 hermes] node-2 sees content=9c988d5d-4b8f-4812-aa92-0eb47f751f0b [scenario-13 hermes] node-3 sees content=9c988d5d-4b8f-4812-aa92-0eb47f751f0b [scenario-13 hermes] node-4 sees content=9c988d5d-4b8f-4812-aa92-0eb47f751f0b
Scenario 14 — Partition tolerance PASS
scenario-14.json (report)
{
"scenario": "14",
"pass": true,
"agent_group": "hermes",
"partition_target": "node-3",
"expected_post_recovery": 20,
"node3_saw": 20,
"reasons": []
}
scenario-14.log (console trace)
[scenario-14 hermes] suspending ai-memory on node-3 (SIGSTOP) [scenario-14 hermes] writing 10 memories each from alice + bob during node-3 outage [scenario-14 hermes] resuming ai-memory on node-3 (SIGCONT) [scenario-14 hermes] settle 20s for post-partition catchup [scenario-14 hermes] checking node-3 caught up [scenario-14 hermes] node-3 sees 20 memories in scenario14-partition (expected 20)
Scenario 15 — Read-your-writes PASS
scenario-15.json (report)
{
"scenario": "15",
"pass": true,
"agent_group": "hermes",
"uuid": "39372635-7d3a-4ed9-b45c-2000e95044ed",
"writer_sees_own_write": 1,
"reasons": []
}
scenario-15.log (console trace)
[scenario-15 hermes] alice writes + immediately reads M1 on node-1 (uuid=39372635-7d3a-4ed9-b45c-2000e95044ed) [scenario-15 hermes] alice sees 1 (expected 1) immediately after write
Scenario 16 — Tier promotion PASS
scenario-16.json (report)
{
"scenario": "16",
"pass": true,
"agent_group": "hermes",
"m1_id": "87a78de8-7abb-45a9-b8c9-8c020ca4121a",
"promote_http_code": "200",
"bob_sees_tier": "long",
"reasons": []
}
scenario-16.log (console trace)
[scenario-16 hermes] alice writes M1 tier=short on node-1 [scenario-16 hermes] M1 id=87a78de8-7abb-45a9-b8c9-8c020ca4121a [scenario-16 hermes] alice promotes M1 to tier=long [scenario-16 hermes] promote returned HTTP 200 [scenario-16 hermes] bob reads M1 on node-2 and checks tier [scenario-16 hermes] bob sees tier=long (expected long)
Scenario 17 — Stats consistency PASS
scenario-17.json (report)
{
"scenario": "17",
"pass": true,
"agent_group": "hermes",
"expected_count": 15,
"per_peer": {
"node_1": 15,
"node_2": 15,
"node_3": 15,
"node_4": 15
},
"reasons": []
}
scenario-17.log (console trace)
[scenario-17 hermes] phase A: each of 3 agents writes 5 memories to scenario17-stats [scenario-17 hermes] ai:alice on 45.55.136.51 [scenario-17 hermes] ai:bob on 165.227.101.0 [scenario-17 hermes] ai:charlie on 143.198.31.2 [scenario-17 hermes] settle 15s for W=2 fanout [scenario-17 hermes] phase B: querying count on every peer [scenario-17 hermes] node-1 count=15 (expected 15) [scenario-17 hermes] node-2 count=15 (expected 15) [scenario-17 hermes] node-3 count=15 (expected 15) [scenario-17 hermes] node-4 count=15 (expected 15)
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": "hermes",
"query": "morning outdoor exercise routine",
"writers": [
{
"agent": "ai:alice",
"marker": "alice-sunrise-4c2a4cfc-f0a5-49a9-b091-84c2c2fbb18f",
"seen_by_charlie": 0
},
{
"agent": "ai:bob",
"marker": "bob-daybreak-e1ae71c6-6203-478e-a441-2db887fdcb4b",
"seen_by_charlie": 0
}
],
"reasons": [
"semantic query did not surface alice's memory",
"semantic query did not surface bob's memory"
]
}
scenario-18.log (console trace)
[scenario-18 hermes] alice writes A on node-1 [scenario-18 hermes] bob writes B on node-2 [scenario-18 hermes] settle 15s for fanout + index rebuild [scenario-18 hermes] charlie queries on node-3 with semantically-related prompt [scenario-18 hermes] charlie sees alice's memory: 0 (expected >=1) [scenario-18 hermes] charlie sees bob's memory: 0 (expected >=1)
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-4.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-4.log
- scenario-5.log
- scenario-6.log
- scenario-9.log