STREAMING_ENABLED=true. Reporter does not publish these facts to Kafka. When streaming is off, manager and worker use a no-op emitter and do not start an outbox dispatcher.
Envelope and routing
Every event usesce-source reporter, ce-schemaversion 1.0.0, and a source-qualified ce-type in the form studio.lerian.reporter.<resource>.<event>. The payload is JSON with snake_case keys.
Use the shared envelope for the complete CloudEvents header contract.
Delivery semantics
Reporter emits after the business-state change has committed. Publication errors do not fail the underlying operation.- Important: direct publication, with durable outbox fallback when the broker circuit is open.
- Critical: Reporter skips direct publication. It always persists the event to the durable outbox for dispatch and retry.
- Both policies request
on_routable_failure, but the current RabbitMQ routes define no explicit DLQ destination. The publisher sees a routable failure. No copy goes to a dead-letter route. - Broker delivery is at least once. Consumers must be idempotent and deduplicate with
(ce-source, ce-id).
Emitted event catalog
Both manager and worker emit
report.errored. All variants use deterministic ce-id reporter.report.error.<report_id>. A consumer deduplicating on (ce-source, ce-id) therefore keeps only the first report.errored received for a report_id. Critical deadline transitions use reporter.deadline.<event_type>.<deadline_id>.<timestamp>.
Complete data contracts
These TypeScript-style declarations mirror the JSON wire shape. ? means the property is optional. | null means the property is present but can be JSON null. Timestamps are RFC 3339 strings.
Separate internal command rail
Manager sends worker a non-CloudEvents JSON command on RabbitMQ. It usesRABBITMQ_EXCHANGE, RABBITMQ_GENERATE_REPORT_KEY, and RABBITMQ_GENERATE_REPORT_QUEUE, with persistent delivery. This command is not part of the public event catalog.
Inbound event status
Reporter consumes no publiclib-streaming fact. Its Hub subscriber remains unavailable: enabling it is rejected at startup until a compatible downstream worker contract exists.
