Skip to content

Configuration Reference

Every configuration key the Rust port reads, with its type, default, and the crate that reads it. All keys were enumerated from this repository's source (AppConfigReader / ConfigReader lookups across crates/*/src), so each entry is guaranteed to exist in the running code — nothing here is inherited from the Java documentation unverified.

Applications are configured through resources/application.yml (or the equivalent application.properties). The configuration syntax is kept verbatim from the Java original — classpath:/ and file:/ location prefixes, ${ENV_VAR:default} environment substitution, and dot/bracket composite keys — so configuration files port between the two implementations unchanged.

Resolution order for any key: -Dkey=value runtime arguments (the JVM -D analog, passed after -- on the cargo command line) win over configuration-file values, and the files themselves merge in the manifest order described below.

Rust port

The Java configuration reference documents many keys that do not exist in this port and are therefore absent from this page: the Spring Boot integration keys (spring.*, server.port), TLS and server extras (rest.server.ssl*, api.origin, hsts.feature, oversize.http.response.header, websocket.binary.size, websocket.server.port), the service mesh / cloud connector and all Kafka keys, the scheduler, PostgreSQL, sync-over-async/Redis, the OpenTelemetry forwarder (otel.*), classpath scanning (web.component.scan, modules.autostart), threading (kernel.thread.pool, deferred.commit.log), event-script extras (yaml.journal, yaml.multicast), HTTP extras (async.http.temp, stack.trace.transport.size, protect.info.endpoints), and serialization extras (snake.case.serialization, custom.content.types, mime.types). If a key is not on this page, the Rust port does not read it.

Bootstrap: files, profiles, and overrides

app-config-reader.yml (manifest)

Type Default
resource file built-in

The manifest that bootstraps AppConfigReader (crates/platform-core). Its resources: list names the base configuration files, merged in order (later files override earlier ones); profiles: gives the location prefix for profile overlays. An application copy in its resources/ folder overrides the built-in default:

resources:
  - classpath:/bootstrap.properties
  - classpath:/bootstrap.yml
  - classpath:/application.properties
  - classpath:/application.yml

profiles: 'classpath:/application-'

app.profiles.active

Type Default
string (comma/space-separated)

Active configuration profiles. For each profile p, the overlays application-p.properties and application-p.yml are merged over the base configuration. Resolution precedence (read by crates/platform-core): the APP_PROFILES_ACTIVE environment variable → the -Dapp.profiles.active=... process override → this key in the consolidated configuration.

Rust port

Renamed from the Java original's SPRING_PROFILES_ACTIVE / spring.profiles.active — Spring is not ported, so the port uses the generic names outright (a rename, not an alias). The mechanism and precedence are unchanged, so profile overlay files themselves port without modification.

yaml.preload.override

Type Default
string (comma-separated locations)

Optional list of override-file locations (classpath:/... or file:/...) that rename, fan out, or re-tune the instances of any #[preload] route at deploy time — without recompiling (the Java operational surface, ported with identical semantics). A missing or malformed file is logged and skipped, so a deployment can chain optional locations. Each file carries a top-level preload list; every entry names an original route declared in a #[preload], a routes replacement list, an optional instances count, and an optional keep-original: true that adds the original back into the set:

preload:
  - original: "hello.world"
    routes:
      - "hello.one"
      - "hello.two"
    instances: 20
    keep-original: true

Across multiple files the route sets for the same original are UNIONed and the first file to set instances wins. Applied at boot between inventory collection and registration; env_instances resolution happens first, then a matched override replaces the route list (sorted) and — when its instances is positive — the resolved count, logged as Preload [original] as [routes], instances old to new. Read by crates/platform-core (AutoStart).

Application identity

application.name

Type Default
string application

The application name (Platform::name()), shown in startup logs and the /info actuator response. Read by crates/platform-core.

Rust port

The Java spring.application.name fallback is retired along with the other Spring names; application.name is the only key consulted.

info.app.version

Type Default
string the platform-core crate version

Application version string shown in the /info actuator response. Read by crates/platform-core (actuator).

info.app.description

Type Default
string the application name

Application description shown in the /info actuator response. Read by crates/platform-core (actuator).

Server and REST automation

rest.automation

Type Default
boolean false

Enables the REST automation engine: the HTTP server starts and serves the endpoints declared in rest.yaml. Read by crates/platform-core (application lifecycle). The HTTP server also starts when at least one #[websocket_service] is registered, even with this key off.

rest.server.port

Type Default
int 8085

Listening port of the REST automation server. 0 binds an ephemeral port (tests and embedders recover the assigned port through automation::server_address()). Read by crates/platform-core; also read by crates/knowledge-graph to render the websocket workbench page URLs.

yaml.rest.automation

Type Default
string (location) classpath:/rest.yaml

Location of the REST endpoint configuration file. Read by crates/platform-core (automation server) at HTTP server start.

Rust port

A single location — the Java comma-separated multi-file merge is not ported. Static content is always served from the application's resources/public folder (the Java static.html.folder key is not ported), and the static-content.filter / static-content.no-cache-pages blocks are rest.yaml sections here, not application configuration keys.

websocket.idle.timeout

Type Default
int (seconds) 60

Idle expiry for websocket connections (floor 10 seconds). A connection with no traffic for this long is closed with code 1003. Read by crates/platform-core (websocket server).

Rust port

The unit is seconds in this port (verified against the websocket server source); the Java reference documents its key in minutes.

HTTP client

http.client.connection.timeout

Type Default
int (milliseconds) 5000

Connection timeout of the built-in async HTTP client (async.http.request). Read by crates/platform-core (automation). The per-request time-to-live is separate — it travels as the x-ttl header on the request event (default 30 seconds; see Reserved Names & Headers).

yaml.event.over.http

Type Default
text (config location) classpath:/event-over-http.yaml

Location of the optional declarative Event-over-HTTP routing map. Each event.http[] entry in the file maps a route name to a peer's /api/event endpoint (with optional per-target security headers such as authorization), and every PostOffice send/request to that route is then forwarded over HTTP transparently — user code cannot tell a remote route from a local one. An absent file simply disables the feature. ${...} references (environment variables, base configuration keys) resolve inside the values. Read by crates/platform-core (automation) on first use. See the Event over HTTP guide for the file format and forwarding semantics.

Tracing and observability

http.trace.id.header

Type Default
string (header name) X-Trace-Id

The HTTP header recognized inbound (when no W3C traceparent is present — a well-formed traceparent always takes precedence) and emitted outbound by the async HTTP client as the trace id. Read by crates/platform-core (REST automation server and HTTP client). A rest.yaml endpoint entry may override the header name per endpoint with its optional trace.id.header key.

http.correlation.id.header

Type Default
string (header name) X-Correlation-Id

The HTTP header carrying the business correlation-id. Captured at the REST automation edge (a fresh dash-less UUID is generated when absent), exposed to the target function as the read-only my_correlation_id request header, preserved by the flow engine, propagated on every PostOffice send/RPC inside a traced request, and emitted by the async HTTP client on downstream calls. Read by crates/platform-core (server and HTTP client) and crates/event-script (flow adapter). A rest.yaml endpoint entry may override the header name per endpoint with its optional correlation.id.header key.

http.traceparent.header

Type Default
string (header name) traceparent

The HTTP header name carrying the W3C trace context (the full traceparent value: trace-id, parent span-id and flags). When customized, outbound HTTP calls (the async HTTP client and Event-over-HTTP) stamp the same W3C value under both names. Inbound, the standard traceparent always wins — the custom name is read only when the standard header is absent: a well-formed standard traceparent means the caller already speaks W3C/OTel, so a proprietary header alongside it is residual and safely ignored. Read by crates/platform-core (REST automation server, HTTP client and Event-over-HTTP client). Overridable per endpoint with traceparent.header in a rest.yaml entry.

Our position: use the standard. traceparent is the W3C Trace Context header that OpenTelemetry and the wider observability ecosystem interoperate on, and the framework implements it as the default with zero configuration. This optional setting exists for backward compatibility with legacy systems only — an intermediary (typically an API gateway with a header allow-list) or an upstream convention that cannot be fixed promptly. Departure from the standard is discouraged: a renamed carrier is invisible to standards-compliant tooling (OpenTelemetry SDKs, service meshes, APM agents) and every participant must be configured alike. Treat a custom name as a temporary bridge, and plan the migration back to the standard header (e.g. fixing the gateway allow-list).

skip.rpc.tracing

Type Default
string (comma/space-separated routes) async.http.request

Route names excluded from distributed trace recording (in addition to the telemetry plumbing itself, which is always excluded). Read by crates/platform-core (worker dispatch).

Logging

log.format

Type Default
text | json | compact text

Application log output format: text is a plain console line; json pretty-prints each record; compact emits single-line jsonl records (no CR/LF within a record). Both JSON forms carry the application log context block (on by default — see app.log.context). Read by crates/platform-core (logging). Switch at launch with -Dlog.format=json.

app.log.context

Type Default
boolean true

Turns the application log context on or off. When on (the default), the structured JSON formats (log.format=json or compact) stamp a context block — correlation id, trace/span ids, service name — into every log line a traced function emits, using the built-in default-log-context.yaml template. Provide your own app-log-context.yaml on the resource path to replace the template, or set this key to false to opt out. Read by crates/platform-core (logging).

log.level

Type Default
error | warn | info | debug | trace | off info

Process log level. The RUST_LOG environment variable, when set, wins over this key. Read by crates/platform-core (logging).

Rust port

A port addition — the Java original configures levels through log4j2 XML instead.

app-log-context.yaml (optional resource file)

Type Default
resource file absent (the built-in default-log-context.yaml applies)

Replaces the built-in log-context template entirely. Its context: section maps an output key of your choice to a reserved $token ($cid, $traceId, $tracePath, $spanId, $parentSpanId, $service, $utc — resolved live per line), a ${ENV:default} substitution (resolved once at load), or a literal. Keys that resolve to nothing are omitted. Business key-values added with PostOffice::update_context join the same block. When this file is absent, the built-in default template (the seven standard trace-context keys) applies — see app.log.context above to switch the feature off. Read by crates/platform-core (logging).

Actuators and health

show.env.variables

Type Default
string (comma-separated names)

Environment variable names to expose through the /env actuator endpoint. Read by crates/platform-core (actuator).

show.application.properties

Type Default
string (comma-separated keys)

Application configuration keys to expose through the /env actuator endpoint. Read by crates/platform-core (actuator).

mandatory.health.dependencies

Type Default
string (comma-separated routes)

Route names of health-check functions that must all report healthy for /health to return HTTP 200. Read by crates/platform-core (actuator).

optional.health.dependencies

Type Default
string (comma-separated routes)

Route names of health-check functions whose failure is reported in the /health response without failing it. Read by crates/platform-core (actuator).

Performance and back-pressure

worker.instances.actuator.services

Type Default
int 5

Worker-instance count for the whole actuator family (/info, /info/routes, /env, /health, /livenessprobe). The default is a rule of thumb; operations teams fine-tune it in QA/Perf environments before promoting to production, and /info/routes displays the effective counts. The key name is shared with the Java engine (whose actuators are one aliased class keyed by its primary route actuator.services — that route itself is not ported), so one runbook line tunes both engines. A non-numeric value falls back to the default (env_instances semantics). Read by crates/platform-core at boot.

worker.instances.no.op

Type Default
int 500

Worker-instance count of the built-in no.op echo function. Read by crates/platform-core (application lifecycle).

Rust port

The Java generic worker.instances.<route> override pattern is not ported. A function's instance count is configuration-driven through the env_instances parameter of its own #[preload] attribute instead (see the Macros Reference).

elastic.queue.dispatch.mailbox.size

Type Default
int 1024

Capacity of each route manager's inbound mailbox (floor 20). When it fills, senders await — reactive back-pressure, not drops. Read by crates/platform-core (platform registry).

elastic.queue.segment.size.bytes

Type Default
int (bytes) 16777216

Segment-file size of the elastic queue's disk spill (minimum 512). The first 20 events of a burst are held in memory before spilling. Read by crates/platform-core (elastic queue).

transient.data.store

Type Default
string (path) /tmp/reactive

Base directory for the elastic-queue overflow buffer that absorbs event bursts when consumers are slower than producers. Read by crates/platform-core (elastic queue).

running.in.cloud

Type Default
boolean false

When false, a per-instance subdirectory (<application.name>-<origin>) is created under transient.data.store and expired sibling stores are swept at startup. When true, the path is used as-is (for ephemeral containers). Read by crates/platform-core (elastic queue).

Serialization

serializer.null.transport

Type Default
boolean false

Null handling at every boundary — the wire (JSON HTTP responses, websocket frames, outbound HTTP request bodies, the MsgPack envelope encoder) and every in-memory event-bus hop. Default false: null map key-values are omitted — absent means null, and a receiving function sees the key absent regardless of delivery path. Set true when a downstream must distinguish "key present with null value" from "key absent". Only map key-values are affected — array elements (including nulls) are always kept so ordering is preserved, and an empty [] or {} is a real value, never treated as null. Read once at startup by crates/platform-core (serializer) and cached for the process lifetime.

Port note

Since increment 58 the strip is applied deterministically on every hop, exactly like the Java engine (which serializes every bus message). Earlier Rust builds stripped only when back-pressure spilled an event to disk, so null visibility could vary with load — that nondeterminism is gone.

Event Script (flow engine)

yaml.flow.automation

Type Default
string (location) classpath:/flows.yaml

Location of the flow manifest, compiled at startup by the flow compiler (a before-application hook at sequence 5). The manifest lists the flow definition files and where to find them:

flows:
  - 'hello-flow.yml'

location: 'classpath:/flows/'

location inside the manifest defaults to classpath:/flows/. Read by crates/event-script (compiler).

max.model.array.size

Type Default
int 1000

Ceiling for a dynamically resolved array index on the right-hand side of a data mapping (a [model.x] index) — a mapping whose resolved index exceeds it fails instead of allocating an arbitrarily large state-machine array. Literal numeric indices are not capped (same as the Java engine). Read once by crates/event-script (task executor).

Port note

Added in increment 52 (parity remediation): the key existed in the Java engine from the start, and the syntax guide already described it — the Rust executor now enforces it.

Knowledge graph and Playground

app.env

Type Default
string dev

The environment gate for the Playground developer surface. The interactive services — the command grammar, the graph traveler, the websocket UI, the AI-companion endpoints, uploads, inspection, and the mock functions — are each declared with #[optional_service("app.env=dev")] and register only when this key is dev. Any other value (e.g. ${APP_ENV:dev} resolved to prod) runs graphs only through POST /api/graph/{graph-id} and serves the /template home page instead of /public. Read by crates/knowledge-graph.

graph.model.automation

Type Default
string (location) — (unset = skip)

Location of the graph manifest listing the graph models to compile and register at startup (a graphs: list of graph ids, loaded from location.graph.deployed). When unset or empty, graph compilation is skipped. Read by crates/knowledge-graph (compiler).

location.graph.deployed

Type Default
string (location) classpath:/graph

Where deployed graph models live (classpath:/ or file:/; anything else falls back to the default). The Playground deploy command writes here and import graph from {deployed} reads from here. Read by crates/knowledge-graph.

location.graph.temp

Type Default
string (path) /tmp/graph

The Playground draft-graph scratch folder. Must be on the local file system (classpath: is rejected because of read/write requirements); a file: prefix is accepted and stripped. Invalid values fall back to the default. Read by crates/knowledge-graph (Playground commands).

graph.max.loop.interval

Type Default
int (milliseconds) 1000

The observation window of the graph traversal loop guard (floor 100). Together with graph.node.high.frequency, it detects a runaway cycle: a node revisited too often within the window aborts the traversal. Read by crates/knowledge-graph.

graph.node.high.frequency

Type Default
int (hits per window) 10

How many visits to the same node within graph.max.loop.interval count as a runaway loop (floor 2). Read by crates/knowledge-graph.

Application-defined keys

Two framework mechanisms read keys whose names the application chooses, so any such key in an example's application.yml is application configuration, not a framework key:

  • env_instances#[preload(route = "...", env_instances = "my.pool.size")] reads my.pool.size at startup for the worker count (the value may itself use ${SOME_ENV:default} syntax); the literal instances is the fallback.
  • #[optional_service("condition")] — the condition references any configuration key (key=value, key, !key); see the Macros Reference.

Adapted from the mercury-composable guide docs/guides/configuration-reference.md; keys/APIs enumerated from this repository's source.