Quick diagnostic tree
Symptom index
Edge v2 cutover
After upgrading to edge v2 (ilyama PR #283), batches route throughedge_ingress_exchange and the edge worker — not the integration worker or legacy telemetry.edge_export_segment ingress.
No lineages despite MQTT traffic
Check:- Edge worker registered — domain-workers logs should show
edge worker registered. IfEDGE_WORKER_DISABLED=1, unset it and restart. - RabbitMQ topology synced — run
make rabbitmq-topologyafter upgrade. Queues must exist onedge_ingress_exchange(edge_telemetry_ingest_stream,edge_state_ingest_queue,edge_meta_queue). - TSDB available — edge worker requires Timescale for staging and mirror tables. Startup fails closed if TSDB pool is missing.
- Broker fan-in — mqtt-broker must publish to
edge_ingress_exchange(not integration exchange). Confirm broker version matches edge v2 hooks.
- MQTT connects; no lineages; no edge worker consume logs
- Broker logs show publish to unknown exchange or unrouted messages
Downlink controls not reaching device
Check:- Edge worker stages
EdgeIngestControlRequestedV2(domainedge, notintegration). mqtt_broker_downlink_queuebinding includesedge.ingest_control.requested.v1.- Device subscribes to
{root}/sync/ingest/controlwith persistent session (QoS 1).
Telemetry vs row batches mixed up
Publishing row journal data on the telemetry topic (or vice versa) causes validation rejects or empty lineages.
Connectivity
Device offline in console
Check:- Broker URL reachable from device network
- mTLS cert not expired; CA matches broker
OMEGA_DEVICE_IDequals registered device name- Firewall allows MQTT TLS (8883) or QUIC UDP
Connected but no lineages
Check:OMEGA_ROOT_TOPICmatches provisioned ACL ({slug}/{name}or/{name})- Omega module
sqlite-replicationin required modules source.dbpath correct; tables have PRIMARY KEY- Journal receiving writes (restart Omega after app writes)
Batch rejected at broker/worker
Common rejection codes:
→ Limits and errors
Schema review issues
Review stuck in queued
- Another operator may need to claim — or claim yourself:
cin TUI - Confirm permission
PROJECT_CAN_MANAGE_DEVICES
Expected review on every new table
Normal with default policy. First batch from eachsource_table triggers ambiguous classification.
Action: Schema review workflow
Device still sending during review
Normal. Cloud stages server-side for both Pipeline A (telemetry) and Pipeline B (rows/batch). Device does not receivepause_lineage for review-only pause.
Verify staged rows increasing (d in TUI). Telemetry batches appear with event_ts; row batches show commit_seq.
Schema hash mismatch after firmware update
Application migration changed DDL → new hash → new review. Action: Claim review, inspect diff via staged payloads, approve new column actions or reject and fix firmware.Materialization
Approved but written data still empty
Checklist:- Replay intent completed? — lineage detail in TUI
- Materialization error count > 0? — use
xreset after fixing root cause - Edge worker running with TSDB (not integration worker)
- Column actions all
ignore? — re-approve withmirrororauto_create_and_map - For telemetry lineages, query the lineage’s
edge_ts_*hypertable rather than the legacy shared telemetry table
materialization_failed staging reason
Transient mirror DDL or write error. Rows staged with reasonmaterialization_failed before circuit breaker confirms pause.
Action: Read error on lineage detail → fix TSDB/DDL → POST .../reset-materialization
Live batches dropped after approve
Indicates missing live materialization path or edge worker not consuming the correct pipeline queue. Mitigation: Confirm edge worker version includes live write paths for your pipeline; staged replay may still work for backlog.State write-back
HTTP 403 edge_state_not_cloud_authoritative
The lineage sync authority is device_authoritative. Cloud write-back only works for tables approved as cloud_authoritative.
Action: Re-approve with the correct authority or use device-side journal updates instead.
HTTP 404 / mirror not provisioned
Complete schema review before calling state write-back. Mirror/state DDL is provisioned on approve.Device never applies state_write downlink
Check:- Response includes
control_id— track inedge_pending_controlsuntil device ACKs - Device subscribed to
sync/ingest/control - Omega version implements
state_writelocal apply - Verify the target row changed in local SQLite
- On the next device upload, confirm the affected PK carries
lkcv
Approve failures
HTTP 500 on approve
Historical deployed bug: mirror binding upsert beforemirror_id assigned.
Symptoms: Approve fails with internal error; review stays in_review.
Action: Deploy current edge worker from ilyama. Contact platform team if self-hosted on older build.
HTTP 409 on TUI auto-approve
TUIa enables allow_auto_create_device_data_points via policy PATCH before approve. If policy PATCH returns 404 or approve returns 409, use the HTTP API with explicit column_actions.
Action: Refresh review (r) and retry, or approve via API reference.
defer columns block activation
If required columns use actiondefer, lineage stays paused after approve.
Action: Re-open review or submit amended approve with full mirror/map actions.
Backpressure on device
Device logs pause_lineage
Cause: Staged row cap (100k rows / 1 GiB default) or materialization circuit breaker. Device behavior: Must ACK, stop publishing that table, buffer locally. Operator:- Inspect staged volume — approve pending reviews to drain
- Wait for auto-resume below 80% threshold
- Do not expect TUI
xto fix volume pause
Device logs resume_lineage
Device should drain buffer fromserver_watermark + 1. If sync stalls after resume, check state.db integrity.
Buffer lost during long pause
If local retention exceeded, incremental sync may gap. Future: bootstrap snapshot via secondary flow. Today: re-mutate rows on device or delete lineage and re-enroll.Historical data gaps
Rows existed before Omega start
Ifsnapshot_on_first_run is disabled, triggers only capture writes after module install. Enable snapshot_on_first_run: true when you need Omega to seed existing rows once before incremental sync.
Workarounds:
- Run UPDATE touching all rows after Omega start
- Re-insert seed data after Omega running
- Wait for bootstrap snapshot support
Omega was down during app writes
Journal accumulates while Omega offline (triggers still fire). On restart, flush catches up — verifycommit_seq advances in staged/mirror data.
Identity mismatches
Use
golain devices get for UUID vs name. Use lineage ID from Edge Sync for state write-back.
Registry / coalescing issues
→ Registry coalescing