### Action Approval Data Model Actions are JSON files stored in `/opt/homelab/actions/{status}/{action_id}.json`. #### Statuses - `pending`: Waiting for operator approval. - `approved`: Approved by operator, ready for execution. - `rejected`: Rejected by operator, will not be executed. - `running`: Currently being executed by an agent. - `completed`: Successfully executed. - `failed`: Execution failed. #### Schema ```json { "action_id": "string", "service": "string", "node": "string", "type": "deploy_service | restart_service | rollback | scale", "risk": "nominal | guarded | critical", "status": "pending | approved | rejected | ...", "created_at": , "updated_at": , "details": { "image": "string", "reason": "string", "diff": "string" }, "transition_history": [ { "from": "string | null", "to": "string", "timestamp": , "by": "string (system | operator-tg-12345 | webui)" } ] } ``` #### Workflow 1. A system component (e.g. `runtime-materializer` or a future analyzer) creates a file in `actions/pending/`. 2. `telegram-bot` detects the file, sends a message to allowed users. 3. Operator clicks "Approve" or "Reject". 4. `telegram-bot` moves the file to `actions/approved/` or `actions/rejected/` atomically, appending a transition to `transition_history`. 5. The responsible agent (e.g. `stability-agent` on the target node) picks up the `approved` action, moves it to `running`, executes it, and finally moves it to `completed` or `failed`.