← run

env-03-elect-collect

0.250
1/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] write_file({"node": "peer0", "path": "peer.py", "content": "#!/usr/bin/env python3\nimport os\nimport socket\nimport threading\nimport time\n\n# Read own priority and value\nwith open('priority.txt', 'r') as f:\) -> {"ok": true, "node": "peer0", "path": "peer.py"}
[turn 3] write_file({"node": "peer1", "path": "peer.py", "content": "#!/usr/bin/env python3\nimport os\nimport socket\nimport threading\nimport time\n\n# Read own priority and value\nwith open('priority.txt', 'r') as f:\) -> {"ok": true, "node": "peer1", "path": "peer.py"}
[turn 4] write_file({"node": "peer2", "path": "peer.py", "content": "#!/usr/bin/env python3\nimport os\nimport socket\nimport threading\nimport time\n\n# Read own priority and value\nwith open('priority.txt', 'r') as f:\) -> {"ok": true, "node": "peer2", "path": "peer.py"}
[turn 5] write_file({"node": "peer3", "path": "peer.py", "content": "#!/usr/bin/env python3\nimport os\nimport socket\nimport threading\nimport time\n\n# Read own priority and value\nwith open('priority.txt', 'r') as f:\) -> {"ok": true, "node": "peer3", "path": "peer.py"}
[turn 6] verify({}) -> {"passed": false, "checks": [{"name": "leader peer1 totalled all values", "ok": false, "detail": "peer1='' want 'SUM=100'"}, {"name": "peer0 deferred to the leader", "ok": false, "detail": "peer0=''"}
[turn 7] run({"node": "peer0", "cmd": "python peer.py 2>&1 | head -50"}) -> {"rc": 0, "output": "Error sending to PEER1: [Errno 111] Connection refused\nError sending to PEER2: [Errno 111] Connection refused\nError sending to PEER3: [Errno 111] Connection refused\nTimeout wai
[turn 8] write_file({"node": "peer0", "path": "peer.py", "content": "#!/usr/bin/env python3\nimport os\nimport socket\nimport threading\nimport time\n\n# Read own priority and value\nwith open('priority.txt', 'r') as f:\) -> {"ok": true, "node": "peer0", "path": "peer.py"}
[turn 9] write_file({"node": "peer1", "path": "peer.py", "content": "#!/usr/bin/env python3\nimport os\nimport socket\nimport threading\nimport time\n\n# Read own priority and value\nwith open('priority.txt', 'r') as f:\) -> {"ok": true, "node": "peer1", "path": "peer.py"}
[turn 10] write_file({"node": "peer2", "path": "peer.py", "content": "#!/usr/bin/env python3\nimport os\nimport socket\nimport threading\nimport time\n\n# Read own priority and value\nwith open('priority.txt', 'r') as f:\) -> {"ok": true, "node": "peer2", "path": "peer.py"}
[turn 11] write_file({"node": "peer3", "path": "peer.py", "content": "#!/usr/bin/env python3\nimport os\nimport socket\nimport threading\nimport time\n\n# Read own priority and value\nwith open('priority.txt', 'r') as f:\) -> {"ok": true, "node": "peer3", "path": "peer.py"}
[turn 12] verify({}) -> {"passed": false, "checks": [{"name": "leader peer1 totalled all values", "ok": false, "detail": "peer1='OK' want 'SUM=100'"}, {"name": "peer0 deferred to the leader", "ok": true, "detail": "peer0='OK
[turn 13] run({"node": "peer1", "cmd": "python peer.py 2>&1 | head -50"}) -> {"rc": 0, "output": "Exception in thread Thread-1 (start_server):\nTraceback (most recent call last):\n  File \"/home/psc/miniconda3/lib/python3.12/threading.py\", line 1075, in _bootstrap_inner\n    
[turn 14] run({"node": "peer2", "cmd": "python peer.py 2>&1 | head -50"}) -> {"rc": 0, "output": "  File \"/tmp/psenv-env-03-elect-collect-67f0m4li/peer2/peer.py\", line 17\n    parts = key[5:].split('_'))\n                              ^\nSyntaxError: unmatched ')'\n"}