46 lines
1.5 KiB
Markdown
46 lines
1.5 KiB
Markdown
### 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": <unix_seconds>,
|
|
"updated_at": <unix_seconds>,
|
|
"details": {
|
|
"image": "string",
|
|
"reason": "string",
|
|
"diff": "string"
|
|
},
|
|
"transition_history": [
|
|
{
|
|
"from": "string | null",
|
|
"to": "string",
|
|
"timestamp": <unix_seconds>,
|
|
"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`.
|