← run

env-03-elect-collect

0.000
0/4 tests· goal-state-env
Challenge · difficulty 5/5
# Leader election + aggregation

Four peers (`peer0`..`peer3`) run on a private network, fully connected — each can reach the other
three. There is **no coordinator**. Every peer starts with:

- `priority.txt` — a unique integer priority,
- `value.txt` — an integer value.

Implement `peer.py` so the peers cooperatively:

1. **Elect a leader** = the peer with the highest priority.
2. **Aggregate**: every non-leader peer hands its value to the leader. The leader computes the
   **sum of all four values** (including its own) once it has heard from everyone, and writes
   `SUM=<total>` to `result.txt`. Each non-leader writes `OK` to `result.txt`.

Discovery contract (environment variables):

- `PORT` — the port your peer must listen on.
- `PEER_<NAME>_HOST` / `PEER_<NAME>_PORT` — address of each other peer (e.g. `PEER_PEER1_HOST`).

No peer knows its own name, so identify the leader by its priority value. The leader must not
finalize until it has collected a value from **every** peer (count them from the discovery vars).
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"}) -> {"rc": 0, "output": "total 16\ndrwxrwxr-x 2 psc psc 4096 Jul  2 15:26 .\ndrwx------ 6 psc psc 4096 Jul  2 15:26 ..\n-rw-rw-r-- 1 psc psc    2 Jul  2 15:26 priority.txt\n-rw-rw-r-- 1 psc psc    3 Jul  
[turn 2] run({"node": "peer1", "cmd": "ls -la"}) -> {"rc": 0, "output": "total 16\ndrwxrwxr-x 2 psc psc 4096 Jul  2 15:26 .\ndrwx------ 6 psc psc 4096 Jul  2 15:26 ..\n-rw-rw-r-- 1 psc psc    3 Jul  2 15:26 priority.txt\n-rw-rw-r-- 1 psc psc    3 Jul  
[turn 2] run({"node": "peer2", "cmd": "ls -la"}) -> {"rc": 0, "output": "total 16\ndrwxrwxr-x 2 psc psc 4096 Jul  2 15:26 .\ndrwx------ 6 psc psc 4096 Jul  2 15:26 ..\n-rw-rw-r-- 1 psc psc    3 Jul  2 15:26 priority.txt\n-rw-rw-r-- 1 psc psc    3 Jul  
[turn 2] run({"node": "peer3", "cmd": "ls -la"}) -> {"rc": 0, "output": "total 16\ndrwxrwxr-x 2 psc psc 4096 Jul  2 15:26 .\ndrwx------ 6 psc psc 4096 Jul  2 15:26 ..\n-rw-rw-r-- 1 psc psc    2 Jul  2 15:26 priority.txt\n-rw-rw-r-- 1 psc psc    3 Jul  
[turn 3] read_file({"node": "peer0", "path": "priority.txt"}) -> {"content": "7\n"}
[turn 3] read_file({"node": "peer0", "path": "value.txt"}) -> {"content": "10\n"}
[turn 3] read_file({"node": "peer1", "path": "priority.txt"}) -> {"content": "23\n"}
[turn 3] read_file({"node": "peer1", "path": "value.txt"}) -> {"content": "20\n"}
[turn 3] read_file({"node": "peer2", "path": "priority.txt"}) -> {"content": "15\n"}
[turn 3] read_file({"node": "peer2", "path": "value.txt"}) -> {"content": "30\n"}
[turn 3] read_file({"node": "peer3", "path": "priority.txt"}) -> {"content": "4\n"}
[turn 3] read_file({"node": "peer3", "path": "value.txt"}) -> {"content": "40\n"}
[turn 4] write_file({"node": "peer0", "path": "peer.py", "content": "#!/usr/bin/env python3\nimport socket\nimport os\nimport sys\nimport time\nimport threading\n\ndef main():\n    # Read our own priority and value\n    ) -> {"ok": true, "node": "peer0", "path": "peer.py"}
[turn 5] write_file({"node": "peer1", "path": "peer.py", "content": "#!/usr/bin/env python3\nimport socket\nimport os\nimport sys\nimport time\nimport threading\n\ndef main():\n    # Read our own priority and value\n    ) -> {"ok": true, "node": "peer1", "path": "peer.py"}
[turn 5] write_file({"node": "peer2", "path": "peer.py", "content": "#!/usr/bin/env python3\nimport socket\nimport os\nimport sys\nimport time\nimport threading\n\ndef main():\n    # Read our own priority and value\n    ) -> {"ok": true, "node": "peer2", "path": "peer.py"}
[turn 5] write_file({"node": "peer3", "path": "peer.py", "content": "#!/usr/bin/env python3\nimport socket\nimport os\nimport sys\nimport time\nimport threading\n\ndef main():\n    # Read our own priority and value\n    ) -> {"ok": true, "node": "peer3", "path": "peer.py"}
[turn 6] verify({}) -> {"passed": false, "checks": [{"name": "leader peer1 totalled all values", "ok": false, "detail": "peer1='SUM=20' want 'SUM=100'"}, {"name": "peer0 deferred to the leader", "ok": false, "detail": "peer
[turn 7] run({"node": "peer0", "cmd": "env | grep PEER"}) -> {"rc": 0, "output": "PEER_PEER1_HOST=127.0.0.1\nPEER_PEER2_HOST=127.0.0.1\nPEER_PEER3_HOST=127.0.0.1\nPEER_PEER1_PORT=47455\nPEER_PEER2_PORT=48113\nPEER_PEER3_PORT=49361\n"}
[turn 8] run({"node": "peer1", "cmd": "env | grep PEER"}) -> {"rc": 0, "output": "PEER_PEER0_HOST=127.0.0.1\nPEER_PEER2_HOST=127.0.0.1\nPEER_PEER3_HOST=127.0.0.1\nPEER_PEER0_PORT=39785\nPEER_PEER2_PORT=48113\nPEER_PEER3_PORT=49361\n"}
[turn 8] run({"node": "peer2", "cmd": "env | grep PEER"}) -> {"rc": 0, "output": "PEER_PEER0_HOST=127.0.0.1\nPEER_PEER1_HOST=127.0.0.1\nPEER_PEER3_HOST=127.0.0.1\nPEER_PEER0_PORT=39785\nPEER_PEER1_PORT=47455\nPEER_PEER3_PORT=49361\n"}
[turn 8] run({"node": "peer3", "cmd": "env | grep PEER"}) -> {"rc": 0, "output": "PEER_PEER0_HOST=127.0.0.1\nPEER_PEER1_HOST=127.0.0.1\nPEER_PEER2_HOST=127.0.0.1\nPEER_PEER0_PORT=39785\nPEER_PEER1_PORT=47455\nPEER_PEER2_PORT=48113\n"}
[turn 9] write_file({"node": "peer0", "path": "peer.py", "content": "#!/usr/bin/env python3\nimport socket\nimport os\nimport sys\nimport time\nimport threading\n\ndef main():\n    # Read our own priority and value\n    ) -> {"ok": true, "node": "peer0", "path": "peer.py"}
[turn 9] write_file({"node": "peer1", "path": "peer.py", "content": "#!/usr/bin/env python3\nimport socket\nimport os\nimport sys\nimport time\nimport threading\n\ndef main():\n    # Read our own priority and value\n    ) -> {"ok": true, "node": "peer1", "path": "peer.py"}
[turn 9] write_file({"node": "peer2", "path": "peer.py", "content": "#!/usr/bin/env python3\nimport socket\nimport os\nimport sys\nimport time\nimport threading\n\ndef main():\n    # Read our own priority and value\n    ) -> {"ok": true, "node": "peer2", "path": "peer.py"}
[turn 9] write_file({"node": "peer3", "path": "peer.py", "content": "#!/usr/bin/env python3\nimport socket\nimport os\nimport sys\nimport time\nimport threading\n\ndef main():\n    # Read our own priority and value\n    ) -> {"ok": true, "node": "peer3", "path": "peer.py"}
[turn 10] verify({}) -> {"passed": false, "checks": [{"name": "leader peer1 totalled all values", "ok": false, "detail": "peer1='SUM=20' want 'SUM=100'"}, {"name": "peer0 deferred to the leader", "ok": false, "detail": "peer
[turn 11] run({"node": "peer0", "cmd": "env | grep PORT"}) -> {"rc": 0, "output": "PORT=39785\nPORTS=39785\nPEER_PEER1_PORT=47455\nPEER_PEER2_PORT=48113\nPEER_PEER3_PORT=49361\n"}
[turn 12] run({"node": "peer1", "cmd": "env | grep PORT"}) -> {"rc": 0, "output": "PORT=47455\nPORTS=47455\nPEER_PEER0_PORT=39785\nPEER_PEER2_PORT=48113\nPEER_PEER3_PORT=49361\n"}
[turn 12] run({"node": "peer2", "cmd": "env | grep PORT"}) -> {"rc": 0, "output": "PORT=48113\nPORTS=48113\nPEER_PEER0_PORT=39785\nPEER_PEER1_PORT=47455\nPEER_PEER3_PORT=49361\n"}
[turn 12] run({"node": "peer3", "cmd": "env | grep PORT"}) -> {"rc": 0, "output": "PORT=49361\nPORTS=49361\nPEER_PEER0_PORT=39785\nPEER_PEER1_PORT=47455\nPEER_PEER2_PORT=48113\n"}
[turn 13] write_file({"node": "peer0", "path": "peer.py", "content": "#!/usr/bin/env python3\nimport socket\nimport os\nimport sys\nimport time\nimport threading\n\ndef main():\n    # Read our own priority and value\n    ) -> {"ok": true, "node": "peer0", "path": "peer.py"}
[turn 14] verify({}) -> {"passed": false, "checks": [{"name": "leader peer1 totalled all values", "ok": false, "detail": "peer1='SUM=20' want 'SUM=100'"}, {"name": "peer0 deferred to the leader", "ok": false, "detail": "peer