Iii Engine ConfigSAFE
Effortlessly compose, extend, and observe every service in real-time for the first time ever.
Overview
Effortlessly compose, extend, and observe every service in real-time for the first time ever.
af5298a11de6OBSERVED · 2026-10-28What it tells the agent
The instruction file, verbatim from the audited commit — this is the text the model reads, and the surface the audit's instruction layer examines. Quoted here so you can judge it without cloning anything.
---
name: iii-engine-config
description: >-
Configure a managed iii engine through worker-compose.yaml or a directly supervised engine
through config.yaml. Use for engine ports, RBAC via the rbac-proxy worker, observer limits,
streams, sandboxes, and configuration storage.
---
# Engine Config
iii has two engine configuration modes. Do not mix them.
## Managed Compose engine
The presence of `engine:` means that Compose owns the engine process. Engine worker values are
direct mappings; there is no nested `config:` field.
```yaml
namespace: orders
engine:
url: ws://127.0.0.1:49134
registration_namespace_grace_ms: 5000
workers:
configuration:
adapter:
name: fs
config:
directory: ./config
iii-worker-manager:
host: 127.0.0.1
port: 49134
iii-http-functions: {}
iii-stream:
host: 127.0.0.1
port: 3112
iii-sandbox:
auto_install: true
containers: {}
```
Start it with:
```bash
iii compose --namespace orders-daemon --up --file worker-compose.yaml
```
`engine.url` defaults to `ws://127.0.0.1:49134` and uses Compose's `${VAR:-default}` expansion.
`engine.workers` stays opaque until the engine reads the generated YAML, so its values use
`${VAR:default}` and retain numeric types. Compose materializes an owner-only config under
`<project-dir>/.iii/compose/<daemon-namespace>/` and removes it after clean shutdown. With
`III_COMPOSE_STATE_DIR`, it uses `<state-root>/<project-slug>/<daemon-namespace>/`. Changing `engine:`
requires restarting Compose. Do not combine a managed file with explicit `--engine`.
Allowed engine worker base names are:
- `configuration`
- `iii-worker-manager`
- `iii-http-functions`
- `iii-stream`
- `iii-sandbox`
Use `#instance` for another instance of an allowed worker. `iii-engine-functions`,
`iii-telemetry`, and `iii-observability` are injected automatically and must not be declared.
HTTP, cron, queue, state, pubsub, bridge, application, and custom workers belong under
`containers:`. Add registry packages with:
```bash
iii trigger -n orders-daemon compose::add worker=state
```
## Observers
Since 0.25 the engine reads an optional top-level `observers:` section (`iii-observe` explains the
model). Every key is optional; these are the defaults:
```yaml
observers:
local_dispatch: true # let SDKs run a worker's own functions in-process
max_per_connection: 1024 # observers one connection may own (LIMIT_EXCEEDED)
max_per_function: 4096 # observers one function may have (LIMIT_EXCEEDED)
max_observe_depth: 8 # deeper activations are dropped (LOOP_GUARD)
observer_grace_ms: 30000 # suspended observers of a disconnected worker wait this long
disposed_retention_ms: 3600000 # a worker back after the grace period is told they were disposed
owner_ack_timeout_ms: 30000 # an unacknowledged add fails with OWNER_TIMEOUT
activation_timeout_ms: 30000 # an unanswered activation frees its slot and counts as TIMEOUT
default_max_in_flight: 64 # max_in_flight of an observer that sets none
max_queue_per_observer: 1024 # queued activations beyond max_in_flight (then OVERFLOW)
```
- In `config.yaml` it sits next to `workers:`. In a managed Compose file it goes under
`engine.observers` and is passed through as written.
- Unknown keys and zero counts or depth are rejected at load; zero timeouts only warn. Changes need
an engine restart.
- `observers.local_dispatch: false` turns off in-process calls for every worker.
- Inspect live observers with `engine::observers::list({ function_id?, namespace?, worker? })` and
`engine::observers::get({ id })` (results are filtered to functions the caller may invoke).
`engine::observers::dispose({ id })` is allowed for the observing worker and unrestricted callers.
- Metrics: `iii.observer.activations.total{function_id,delivery}`,
`iii.observer.dropped.total{function_id,reason}`, `iii.observers{state}`,
`iii.observer.reports.total{function_id}`,
`iii.observer.activation.failures.total{function_id,reason}`; locally dispatched calls are counted
in `iii.invocations.total` with `dispatch="local"`.
## RBAC with `rbac-proxy`
Keep the engine port internal and put the `rbac-proxy` worker in front of it when
untrusted workers, browsers, or agents need to connect:
```bash
iii trigger -n orders-daemon compose::add worker=rbac-proxy
```
`rbac-proxy` opens its own WebSocket port, speaks the worker protocol verbatim, and at the boundary
authenticates each connection (`rbac.auth_function_id`), gates every invocation and trigger binding
(`rbac.expose_functions`, plus `allowed_functions` / `forbidden_functions` from the auth result),
namespaces a session's registrations (`function_registration_prefix`), runs
`middleware_function_id` and the registration hooks, and filters `engine::*` discovery results to
what the caller may invoke. Its settings live in the `configuration` worker under id `rbac-proxy`:
```yaml
host: 0.0.0.0
port: 49200 # the public RBAC port
engine_url: ws://127.0.0.1:49134 # the trusted internal engine listener
rbac:
auth_function_id: my-project::auth-function
expose_functions:
- match("api::*")
```
RBAC is mandatory on untrusted networks: only the proxy's port may face one, never the engine port,
and a public proxy must always set `auth_function_id`. Full schema: https://workers.iii.dev/workers/rbac-proxy.
Observers under RBAC (0.25 engine): creating one requires that the session may invoke both the
observed function and the target, or it fails with `FORBIDDEN`. The engine's `rbac:` settings
accept `on_observer_registration_function_id`, a hook with the same contract as
`on_trigger_registration_function_id`: an object answer may rewrite `function_id`,
`target_function_id`, `args`, `filters`, and `metadata`; any other answer denies with `FORBIDDEN`.
Sessions with a `middleware_function_id` get no local dispatch, so the middleware always Trust audit
SAFEgrade B · trust 89/100 Nothing in the source contradicts what it says it does. Grade A is reserved for packages that have also passed the behavioural sandbox.
| Layer | What it checks | Result |
|---|---|---|
| L0 | Provenance & inventory | WARN |
| L1 | Static analysis of the code | PASS |
| L2 | Instruction surface (what it tells the agent) | PASS |
| L3 | Class-specific surface | PASS |
| L4 | Behavioural (sandbox) | SKIPPED |
What the source does
- Filesystem
- none-observed
- Network
- none-observed
- Shell
- none-observed
- Dependencies
- pinned
- Secrets in source
- none-found
Findings (1)
sdk/packages/node/iii/local.yml
Gates applied: no_behavioural_pass.
af5298a11de6full audit observations/trust-audit/skill/iii-hq__iii-engine-config.json · Report an issue / request a re-scanAudit history
Every audit this skill has had.
| Date | Source | Verdict | Grade | Score | Change |
|---|---|---|---|---|---|
| 2026-10-28 | af5298a11de6 | SAFE | B | 89 | first audit |
Questions
What does the iii-engine-config — iii-hq/iii skill do?
Effortlessly compose, extend, and observe every service in real-time for the first time ever.
Is iii-engine-config — iii-hq/iii safe to install?
The audit found nothing in the source that contradicts what it says it does, and graded it B (89/100). Grade A is held back for packages that have also passed a sandboxed behavioural run, which is why a clean skill reads B.
What can iii-engine-config — iii-hq/iii access on my machine?
The audit observed no filesystem, network or shell use at all in its source.
How current is this page?
The grade is for one exact copy of the source (af5298a11de6), read on 2026-10-28. The repository is watched, and a new audit runs when it changes — this is the first audit.
Add this badge to your README
Shows this page's audit result and links back to it. It updates when the audit does.
[](https://modelsatlas.com/skills/iii-hq/iii-engine-config/)
Not your listing, or something out of date? Claim or update your listing.