Safety model

The API is a client of the olix core, not a back door around it. These rules are enforced by the gateway and each one has an automated test that drives a real test-mode core.

Local only

The owner approves actions

Real session: an approve attempt, then a deny
$ curl -s http://127.0.0.1:8780/v1/turns/t_914c50b4669d9e67/answer ... -d '{"question_id": "qmw507q6r0", "decision": "approve"}'
{"error":{"message":"an API client may only deny an approval; the owner approves in the olix app","type":"invalid_request_error","code":"approval_not_allowed","param":null}}
$ curl -s http://127.0.0.1:8780/v1/turns/t_914c50b4669d9e67/answer ... -d '{"question_id": "qmw507q6r0", "decision": "deny"}'
{"answered":true,"decision":"deny","question_id":"qmw507q6r0"}
notes.txt exists: no
{"type":"question","tool":"bash","risk":"mutate","question":"Allow bash?\nRunning printf hello >\n{\n  \"command\": \"printf hello > \\\"/tmp/olix-demo/project/notes.txt\\\"\"\n}"}

The first answer is refused. The second is accepted. The file the turn wanted to write does not exist, and the card is shown to the client as information only.

No vault, no memory, no other apps' sessions

No focus stealing

Nothing in the API activates an app, opens a window or switches a Space. Turns run in the core's background loop.

No fabrication

Endpoints return exactly what the core emitted. If the core is not running you get 503 core_unavailable; if it disappears mid-turn you get an error event, not a made-up completion.

Honest limits