← run

env-05-partition-heal

0.000
0/1 tests· goal-state-env
Challenge · difficulty 5/5
# Partition recovery

Four peers run a grow-only set (G-Set CRDT). They start **split by a network partition**: `peer0` and
`peer1` (side A) can reach each other but not `peer2`/`peer3`; side B (`peer2`, `peer3`) is symmetric.
Each peer seeds one distinct element (`element.txt`).

Implement `peer.py` so that the peers run **anti-entropy gossip**: each serves its current set and
continuously merges in its reachable peers' sets, writing the sorted, comma-joined set to
`result.txt`. While partitioned, each side will only know its own two elements. **After the partition
heals**, every peer must converge on the union of all four elements.

The merge must be safe to repeat (a set union is idempotent + commutative), and peers must keep
retrying every peer so reconciliation resumes once cross-side links come back.

Discovery: `PORT` (your listen port) and `PEER_<NAME>_HOST` / `PEER_<NAME>_PORT` for each peer.
Proposed solution
[turn 1] list_nodes({}) -> {"nodes": [{"name": "peer0", "provides": "python peer.py", "ports": [9000], "needs": ["peer1", "peer2", "peer3"]}, {"name": "peer1", "provides": "python peer.py", "ports": [9000], "needs": ["peer0", "
[turn 2] run({"node": "peer0", "cmd": "ls -la && cat element.txt 2>/dev/null || echo \"element.txt not found\""}) -> {"rc": 0, "output": "total 12\ndrwxrwxr-x 2 psc psc 4096 Jul  2 14:48 .\ndrwx------ 6 psc psc 4096 Jul  2 14:48 ..\n-rw-rw-r-- 1 psc psc    6 Jul  2 14:48 element.txt\nalpha\n"}
[turn 3] run({"node": "peer1", "cmd": "cat element.txt"}) -> {"rc": 0, "output": "bravo\n"}
[turn 4] run({"node": "peer2", "cmd": "cat element.txt"}) -> {"rc": 0, "output": "charlie\n"}
[turn 5] run({"node": "peer3", "cmd": "cat element.txt"}) -> {"rc": 0, "output": "delta\n"}
[turn 6] write_file({"node": "peer0", "path": "peer.py", "content": "#!/usr/bin/env python3\nimport os\nimport time\nimport threading\nfrom http.server import HTTPServer, BaseHTTPRequestHandler\nimport urllib.request\nim) -> {"ok": true, "node": "peer0", "path": "peer.py"}
[turn 7] write_file({"node": "peer0", "path": "peer.py", "content": "#!/usr/bin/env python3\nimport os\nimport time\nimport threading\nfrom http.server import HTTPServer, BaseHTTPRequestHandler\nimport urllib.request\nim) -> {"ok": true, "node": "peer0", "path": "peer.py"}
[turn 8] write_file({"node": "peer1", "path": "peer.py", "content": "#!/usr/bin/env python3\nimport os\nimport time\nimport threading\nfrom http.server import HTTPServer, BaseHTTPRequestHandler\nimport urllib.request\nim) -> {"ok": true, "node": "peer1", "path": "peer.py"}
[turn 9] write_file({"node": "peer2", "path": "peer.py", "content": "#!/usr/bin/env python3\nimport os\nimport time\nimport threading\nfrom http.server import HTTPServer, BaseHTTPRequestHandler\nimport urllib.request\nim) -> {"ok": true, "node": "peer2", "path": "peer.py"}
[turn 10] write_file({"node": "peer3", "path": "peer.py", "content": "#!/usr/bin/env python3\nimport os\nimport time\nimport threading\nfrom http.server import HTTPServer, BaseHTTPRequestHandler\nimport urllib.request\nim) -> {"ok": true, "node": "peer3", "path": "peer.py"}
[turn 11] verify({}) -> {"passed": false, "checks": [{"name": "verifier crashed", "ok": false, "detail": "NotImplementedError: this provider cannot change the network at runtime"}], "launch_errors": []}
[turn 12] run({"node": "peer0", "cmd": "ls -la / | head -20"}) -> {"rc": 0, "output": "total 8388836\ndrwxr-xr-x  23 root root       4096 Dec 21  2024 .\ndrwxr-xr-x  23 root root       4096 Dec 21  2024 ..\nlrwxrwxrwx   1 root root          7 Apr 22  2024 bin -> usr
[turn 13] run({"node": "peer0", "cmd": "pwd && ls -la"}) -> {"rc": 0, "output": "/tmp/psenv-env-05-partition-heal-24_l0tkv/peer0\ntotal 20\ndrwxrwxr-x 2 psc psc 4096 Jul  2 14:49 .\ndrwx------ 6 psc psc 4096 Jul  2 14:48 ..\n-rw-rw-r-- 1 psc psc    0 Jul  2 14
[turn 14] read_file({"node": "peer0", "path": "result.txt"}) -> {"content": "alpha,bravo,charlie,delta\n"}