Observation Event Transport (advisory.observation.updated@1)

Audience: Concelier operators wiring advisory-observation events into downstream consumers.

Concelier publishes advisory.observation.updated@1 events through a PostgreSQL outbox, with an optional NATS JetStream transport for fan-out beyond the database. This guide covers configuration, the publish flow, and the operational signals to watch.

Configuration (appsettings.yaml)

advisoryObservationEvents:
  enabled: false            # set true to publish beyond PostgreSQL outbox
  transport: "postgres"     # "postgres" (no-op publisher) or "nats"
  natsUrl: "nats://127.0.0.1:4222"
  subject: "concelier.advisory.observation.updated.v1"
  deadLetterSubject: "concelier.advisory.observation.updated.dead.v1"
  stream: "CONCELIER_OBS"

Defaults: publishing disabled, transport postgres; the subject and stream are as shown above.

Publish flow

  1. The observation sink writes the event to the advisory_observation_events table (idempotent on observationHash).
  2. A background worker dequeues unpublished rows, publishes them via the configured transport, then stamps publishedAt.
  3. If the transport is disabled or unavailable, the outbox accumulates safely; re-enabling resumes publishing from where it left off.

Operational notes

Testing

Demo review notes (2025-11-25)