Skip to content

Catalogue reference

One catalogue belongs to one application, and an installation admits one application. Format: catalogue.schema.json. Example: common.yaml.

Applications share the format and the framework profiles, never a catalogue. Decided in 0053.

Where it lives

Step Detail
Location Next to the emitting code, under its version control
CI Validated in that repository against this repository's validator
Delivery Embedded in the binary or mounted by the chart
Registration At start-up over RegistryService, which the receiver serves
Archive The receiver copies every version into the archive on first use

Fields

Field Content
source, version, locales Identity and languages
actor_kinds name: category (internal, external, machine), attributes schema
target_types name: is_person, attributes schema
context_areas name: schema
meters name: kind (count, gauge), unit, dimensions schema
actions source.resource.verb: summary, operation, categories, profiles, capture level, delivery, target types, data schema and version, message per locale, meter with quantity path and counted outcomes (success only by default)

Delivery

The action declares its delivery, so a catalogue behaves the same in direct and stream mode. Decided in 0054 and 0059.

delivery The call returns Receiver down For
block When the receiver acknowledges durability The action fails Privileged sign-in, key destruction, billable operation
async (default) At once The record waits in a bounded in-memory queue and is retried with backoff Everything else

An async record is lost only when the queue overflows and drops the oldest, or when the pod dies with the record still queued. The emitter counts each record it gives up as audit.emit.records.dropped and logs it.

The loader refuses the retired values outbox (use block or async) and best_effort (use async), naming the replacement.

Categories

Profiles require categories, never actions. The application's catalogue and the component's own together must cover a profile's required categories. audit validate --deployment reports a gap in CI. The receiver logs one after each registration. Neither refuses an application.

Categories
authentication, privileged_access, account_lifecycle, authorization_decision, configuration_change, data_access, data_change, key_lifecycle, credential_lifecycle, log_access, logging_control, clock, billing

Message templates

Each action has one ICU MessageFormat template per declared locale. The viewer renders them in the browser with FormatJS; exports render none yet. The validator refuses a template that names an argument the record lacks. It also refuses a dotted name, and a data schema where two properties map to one name (/a_b and /a/b are both data_a_b). An argument a record does not carry renders as a gap.

An argument names a record field with an underscore for each step, such as {targets_0_id} or {data_address_city}.

Argument Value
id, source, action, operation, tenant, profile Core fields
occurred_at, recorded_at Timestamps
actor, actor_id, actor_kind The actor; actor alone is its id
subject, subject_id, subject_kind The subject
outcome, outcome_result, outcome_reason, outcome_code outcome is the result word: success, failure or denied
observer_id, observer_instance Who reported it
targets_N_id, targets_N_name, targets_N_type The first four targets, N in 0..3
data_<property> Any property of the action's data schema; nested names join with underscores
meter_name, meter_quantity, meter_unit When the action is metered

Validation in CI

audit validate ./catalogue.yaml
audit check-emitters ./ --catalogue ./catalogue.yaml
Command Checks
validate The document and every .json schema beside it. With --deployment <file>, also the categories a profile requires that nothing emits
check-emitters String literals in a source tree against the catalogue's actions. It cannot see a name assembled at run time