FLYsafe.live — Database Structure & Field Reference

A single reference for what databases and tables exist, what each field is for, and where the current design and the RTM Map mockup disagree.
v1.2 · Conspicuity columns added; oi_geometry removed 2026-08-20

Purpose. This page exists so any developer can answer “what table is this field in, and why does it exist” without reading four separate documents. It is built from two sources: the design (Aircraft_Custodian_dTwin_Strategy.html v1.13, and the deployed rtm-tenant-schema.sql / aadms-schema.sql) and the current build (fsl-rtm-map-mu.html, the RTM Map mockup).

Why it also lists gaps. The design and the mockup were built at different times and now model some things differently — not just missing fields, but incompatible data models in a couple of places. §4 lists every place they disagree so we can decide, as a team, which one is right before more work gets built on top of either.

① Database Landscape

Two physically separate database contexts are involved. Every drone-facing table/view lives in a tenant's own database; AADMS is a single central database that reads across all tenants.

Database / InstanceSchemaObjectTypePurpose
rtm-app-db
one per tenant — airmarket, sait, sandbox
dronesdlb_dronesTableRaw import from the FLYsafe.software DLB API. Written only by the Import process.
dronesv_dlb_dronesViewRenames the two display identifiers on dlb_drones for operator-facing reporting.
dronesdronesTableThe Custodian dTwin record — RTM configuration, OI/automation settings, conspicuity detail, and live telemetry. The core operational table.
dronesdaa_rulesTableOne row per Detect-and-Avoid rule per drone. New in v1.13 — backs the mockup's daa_rules[] panel.
dronesv_dtwinViewJoins dronesdlb_drones. The one view every consumer (Custodian API, frontend, MCP) should read from.
aadms_db
one central instance
aadmsdronesMaterialized ViewCross-tenant callsign → (tenant_id, serial_number) lookup for ADS-B routing. Built with postgres_fdw over every tenant's drones.drones.
Keycloak
external IdP, one realm per tenant
drone-as-user identityExternalAuth-only identity for the drone. ID is <tenant>-<serial>computed, not a stored column or FK.
flights_binding
location/owner not detailed in this doc
flights_bindingExternal / not detailed hereStores the Flight Volume / Contingency Volume / Submitted Volume geometry for current and upcoming flights (v1.13). Replaces the never-built drones.oi_geometry. Its own column-level schema isn't covered by this doc — see its owning reference.

② Entity Relationship Diagram

FLYsafe.live RTM — Table & View Relationships TENANT rtm-app-db · one instance per tenant (airmarket · sait · sandbox) drones.dlb_drones table · raw DLB import PK guid UQ serial_number (partial) Written by Import process only. Never modified by RTM side. FK dlb_guid seeds on 1st INSERT drones.drones table · Custodian dTwin state PK (tenant_id, serial_number) FK dlb_guid → dlb_drones.guid (UQ) Three write owners: Import (first insert), Custodian API (config), GCS Plugin (live state). See §3 for the full column list. 1 : many Custodian DAA endpoints drones.daa_rules table · one row per DAA rule PK (tenant, serial, rule_id) FK → drones.drones New in v1.13. Backs the mockup's daa_rules[] drones.v_dlb_drones view · display renames only drones.v_dtwin view · drones ⋈ dlb_drones on dlb_guid read by: Custodian API, frontend, MCP 🔐 Keycloak (external) drone-as-user, auth only. ID = tenant_id + "-" + serial_number Computed — not a stored column. (keycloak_client_id removed — see §4) 🗺️ flights_binding FV / CV / Submitted Volume geometry for current & upcoming flights. Replaces the never-built oi_geometry. Schema not detailed here (v1.13). AADMS · central database (separate physical instance) aadms.drones materialized view · cross-tenant UQ callsign · IDX serial_number columns: tenant_id, serial_number, guid, callsign, id postgres_fdw one foreign server per tenant REFRESH after each Import sync FK / trigger relationship view reads from / computed reference cross-database FDW read geometry hand-off to flights_binding

③ Table Structure Reference

Every column that is actually stored, grouped the same way the schema itself groups them. Views are described separately below — they don't store anything, so their columns aren't repeated.

drones.dlb_drones — raw DLB import (table)

Written only by the Import process. Column names match the DLB API verbatim — never renamed, never written by RTM.

ColumnTypeWhy it's there
guidTEXT NOT NULL (PK)DLB's drone UUID. The join key every other table/view uses to reach DLB identity.
serial_numberTEXT NOT NULLOEM serial. Part of the natural key used to link to drones.drones.
nameTEXTDrone display name from DLB.
brand, model, drone_type, colorTEXTHardware identity, straight from DLB.
statusTEXTDLB airworthiness status (e.g. Airworthy, Grounded).
identification_numberTEXTTC registration. Exposed as TC_Registration in v_dtwin.
inventory_numberTEXTOperator callsign. Exposed as Callsign in v_dtwin — the ADS-B routing key.
hardware_version, firmware_versionTEXTFlight controller hardware/firmware identity.
flight_controller_serial_number, controller_serial_number, controller_serial_number2TEXTController hardware serials from DLB.
max_horizontal_speedTEXTSeeds drones.drones.horizontal_speed_ms on first insert only.
max_vertical_speedTEXTSeeds drones.drones.vertical_speed_ms on first insert only.
max_flight_time, payload_capacity, weightTEXTRated performance specs. Stored as text to match the DLB source; cast on use.
propulsion_typeTEXTELECTRIC | ICE | HYBRID.
company_guid, user_guidTEXTDLB ownership references.
insurable_value, purchase_date, tech_number, notesTEXTOwnership / financial bookkeeping fields, informational only.
imported_atTIMESTAMPTZ NOT NULLWhen this row was last upserted by the Import process.

drones.drones — Custodian dTwin state (table)

PK (tenant_id, serial_number). Three write owners: the Import process (identity, first insert only), the Custodian APIs (config, from the RTM Map UI or MCP agents), and the GCS Plugin path (live telemetry, via the Custodian).

Core identity

ColumnTypeWhy it's there
tenant_idTEXT NOT NULLWhich tenant owns this row. Half of the primary key.
serial_numberTEXT NOT NULLOther half of the primary key. Matches dlb_drones.serial_number.
dlb_guidTEXT NOT NULL (FK, UQ)Links 1:1 back to dlb_drones.guid for all DLB-sourced identity.

Custodian / adapter configuration

adapter_typeTEXT NOT NULLWhich GCS adapter the Custodian talks to: mavlink | dji_fh2 | dronesense. Set via Custodian API.
adapter_configJSONB NOT NULLAdapter-specific connection settings (host/port for MAVLink, workspace ID for DJI FH2, etc).
publish_rate_hzINT NOT NULLHow often the Custodian publishes telemetry frames.

OI defaults & FLYplan automation

oi_automation_enabledBOOL NOT NULLMaster switch — pilot-granted authority for automated OI declarations.
horizontal_speed_ms, vertical_speed_msFLOAT NOT NULLSeeded from DLB max speed on first insert; operator may override.
fv_buffer_mFLOAT NOT NULLFlight Volume buffer around the predicted trajectory — horizontal only (v1.12). Vertical separation is handled by NMAC/SWC below, not FV/CV.
cv_buffer_mFLOAT NOT NULLContingency Volume buffer, past the FV edge — horizontal only (v1.12).
oi_automation_square_m, oi_automation_radius_mFLOAT NOT NULLOI geometry parameters — valid 350–1400 m and 200–800 m respectively.
oi_automation_amend_min_trigger_mFLOAT NOT NULLMinimum trajectory deviation (m) that triggers an OI amendment.
oi_automation_amend_max_alt_agl_mFLOAT NOT NULLMaximum AGL altitude an amendment can cover.
oi_automation_amend_enabledBOOL NOT NULLWhether automated amendments are permitted for this drone.
waypoint_buffer_mFLOAT NOT NULLRadius within which a mission waypoint counts as reached (valid 5–500 m).

Default pilot & separation defaults

default_pilot_name, default_pilot_fs_guidTEXT NULLPre-filled pilot when a mission is created without an explicit selection.
nmac_h_crewed_m, nmac_v_crewed_mFLOAT NOT NULLNear Mid-Air Collision minimum vs. crewed (manned) traffic — horizontal / vertical (v1.12 split).
nmac_h_uncrewed_m, nmac_v_uncrewed_mFLOAT NOT NULLNMAC minimum vs. uncrewed (other drone) traffic — horizontal / vertical (v1.12 split).
swc_h_crewed_m, swc_v_crewed_mFLOAT NOT NULLStay Well Clear minimum vs. crewed traffic — horizontal / vertical (v1.12 split).
swc_h_uncrewed_m, swc_v_uncrewed_mFLOAT NOT NULLSWC minimum vs. uncrewed traffic — horizontal / vertical (v1.12 split).
eval_distance_mFLOAT NOT NULLConflict evaluation ring (~1 NM default). Not split by crewed/uncrewed.

ADS-B provisioning & ownership

adsb_in_enabled, adsb_out_enabled, adsb_surrogate_enabledBOOL NOT NULLIndependent provisioning flags — a drone can have any combination on.
tisb_rebroadcast_enabledBOOL NOT NULLRebroadcasts this aircraft's own telemetry into the TIS-B feed.
ownership_flag_enabledBOOL NOT NULLOperator's explicit surveillance intent — excludes this drone from DAA conflict calc when set.

Conspicuity / ADS-B detail (v1.13)

Provisioning detail behind the flags above — closes the gap flagged in §4. Not columns: the mockup's ec_callsign / ec_tc_reg are just local aliases for dlb_drones.inventory_number / identification_number (already Callsign / TC_Registration in v_dtwin) — no new column needed for either.

ec_adsb_hexTEXT NULLStatic ADS-B ICAO hex code; set when adsb_hex_mode = 'static'.
adsb_out_deviceTEXT NULLTransponder model, e.g. Ping978ec | Ping2020i | SkyEcho 2 | TISB | other.
adsb_hex_modeTEXT NOT NULLdynamic (ADDRt) | static (user-entered, see ec_adsb_hex).
surveillance_modeTEXT NULLDescriptive surveillance method, e.g. “MLAT + ADS-B”, “ADS-B + Vision”.
daa_enabledBOOL NOT NULLWhether Detect-and-Avoid is active for this drone.
broadcast_bindingTEXT NULLe.g. Bound | Unbound — binding status between this drone and its broadcast identity.
networkid_streaming_enabledBOOL NOT NULLGates NetworkID into RTM viz + DAA. Independent of tisb_rebroadcast_enabled.

Observed ADS-B state (read-only, v1.13)

adsb_observed_broadcastingBOOL NULLWhether this drone is currently observed broadcasting, from surveillance feeds — not the provisioning intent above.
adsb_observed_last_icao_hexTEXT NULLLast ICAO hex actually observed on the air.
adsb_observed_last_seen_by_cifib_atTIMESTAMPTZ NULLLast time the CIFIB upstream gating pipeline saw this drone.

Data source monitoring

data_source_mechanismTEXT NULLHow telemetry is arriving: mp_plugin | chrome_fh2 | dji_cloud | adsb | multi.
data_source_rate_hzFLOAT NULLObserved telemetry rate.
data_source_latency_ms_p50, data_source_latency_ms_p95FLOAT NULLObserved latency distribution.
data_source_statusTEXT NULLHEALTHY | DEGRADED | STALE | DISCONNECTED.
data_source_max_latency_msINT NOT NULLExpected latency envelope — the one field an operator tunes.
data_source_last_seen_atTIMESTAMPTZ NULLLast time this data source reported.

Current flight & current OI

current_mission_id, current_flight_stateTEXT NULLThe mission this drone is executing right now, and its state.
current_flight_window_start, current_flight_window_endTIMESTAMPTZ NULLPlanned execution window for the current mission.
current_waypoint_index, current_waypoint_total, current_progress_pctINT NULLMission progress, updated by Flink flight-monitoring jobs.
current_oi_id, current_oi_state, current_oi_sourceTEXT NULLThe currently active Operational Intent — id, lifecycle state, and how it was created.
current_oi_window_start, current_oi_window_endTIMESTAMPTZ NULLActive OI's time window.
oi_last_regenerated_at, oi_next_regeneration_atTIMESTAMPTZ NULLOI Automation job scheduling bookkeeping.

Live state (written from GCS Plugin telemetry)

position_lat, position_lon, position_altFLOAT NULLLast known position.
flight_mode, armedTEXT / BOOL NULLCurrent flight controller mode and arm state.
battery_remaining_pctINT NULLBattery state, for the map UI and low-battery alerting.
link_rssi_dbmINT NULLC2 link signal strength.
adapter_connectedBOOL NOT NULLWhether the adapter currently has a live telemetry connection.
last_telemetry_atTIMESTAMPTZ NULLLast frame received — drives staleness/DISCONNECTED detection.

Cross-references & timestamps

aadms_idTEXT NULLCross-tenant ADS-B routing reference back into AADMS.
created_at, updated_atTIMESTAMPTZ NOT NULLStandard row bookkeeping.
retired_atTIMESTAMPTZ NULLSet by POST /drones/{serial}/retire. NULL = active.

Where OI geometry actually lives (v1.13)

There is no drones.oi_geometry table. Earlier versions of this page (and the strategy doc, v1.11–v1.12) specified a dedicated drones.oi_geometry table for the Flight Volume / Contingency Volume / Submitted Volume polygons. That table was never built. The three geometries for current and upcoming flights are instead persisted in the existing flights_binding table (see §1 and §2) — outside the drones schema. This page doesn't restate flights_binding's own column-level schema; see its owning reference for that.

drones.daa_rules — DAA rule set (table, v1.13)

One row per Detect-and-Avoid rule per drone — backs the mockup's daa_rules[] array. Rules evaluate in sort_order; each can be enabled/disabled without deleting it.

ColumnTypeWhy it's there
tenant_id, serial_numberTEXT NOT NULLLinks back to the owning drones.drones row (FK).
rule_idTEXT NOT NULL (PK)e.g. R1, R2, R3.
condition_textTEXT NOT NULLHuman-readable trigger condition, e.g. “Target within NMAC radius”.
action_textTEXT NOT NULLAction taken when triggered, e.g. “RTH — Immediate”.
priorityTEXT NOT NULLcritical | high | medium | low.
enabledBOOL NOT NULLRule can be turned off without deleting it.
sort_orderINT NOT NULLEvaluation / display order.
-- drones.daa_rules · one row per DAA rule per drone
-- Read/written by the Custodian API's DAA endpoints; evaluated by the DAA service at runtime.
CREATE TABLE drones.daa_rules (
  tenant_id             text NOT NULL,
  serial_number         text NOT NULL,
  rule_id                text NOT NULL,                             -- e.g. R1, R2, R3

  condition_text        text NOT NULL,                             -- human-readable trigger condition
  action_text            text NOT NULL,                             -- action taken when triggered
  priority                text NOT NULL,                             -- critical | high | medium | low
  enabled                 bool NOT NULL DEFAULT true,
  sort_order             int4 NOT NULL DEFAULT 0,                    -- evaluation / display order

  PRIMARY KEY (tenant_id, serial_number, rule_id),
  FOREIGN KEY (tenant_id, serial_number) REFERENCES drones.drones(tenant_id, serial_number)
);

aadms.drones — cross-tenant lookup (materialized view, central AADMS db)

Physically stored (unlike a plain view) so it has its own column list. Built with postgres_fdw — one foreign server + proxy schema per tenant — aggregating every tenant's drones.dronesdlb_drones into one flat, queryable surface. Refreshed after each Import sync run.

ColumnTypeWhy it's there
tenant_idTEXTWhich tenant this drone belongs to — needed to route back to the right tenant pipeline.
serial_numberTEXTJoin key back to that tenant's own drones.drones row.
guidTEXTAliased from dlb_guid — the DLB identity reference.
callsignTEXT (UQ)Aliased from inventory_number. The actual ADS-B routing key — this is what an inbound ADS-B record carries, so it has the unique index.
idTEXTAliased from aadms_id — cross-tenant reference back to the AADMS side.
-- aadms.drones · cross-tenant drone lookup
-- Materialized view aggregating every tenant's drones.drones rows (joined to dlb_drones for callsign).
-- Foreign servers / user mappings / fdw_<tenant> proxy schemas are set up earlier in aadms-schema.sql.
CREATE SCHEMA IF NOT EXISTS aadms;

CREATE MATERIALIZED VIEW IF NOT EXISTS aadms.drones AS
  -- One UNION ALL block per tenant (via its fdw_<tenant> proxy schema); extend as tenants are added.
  SELECT
    d.tenant_id,
    d.serial_number,
    d.dlb_guid              AS guid,
    dlb.inventory_number    AS callsign,
    d.aadms_id               AS id
  FROM fdw_airmarket.drones d
  JOIN fdw_airmarket.dlb_drones dlb ON dlb.guid = d.dlb_guid
  WHERE d.retired_at IS NULL

  UNION ALL

  SELECT
    d.tenant_id,
    d.serial_number,
    d.dlb_guid              AS guid,
    dlb.inventory_number    AS callsign,
    d.aadms_id               AS id
  FROM fdw_sait.drones d
  JOIN fdw_sait.dlb_drones dlb ON dlb.guid = d.dlb_guid
  WHERE d.retired_at IS NULL

  UNION ALL

  SELECT
    d.tenant_id,
    d.serial_number,
    d.dlb_guid              AS guid,
    dlb.inventory_number    AS callsign,
    d.aadms_id               AS id
  FROM fdw_sandbox.drones d
  JOIN fdw_sandbox.dlb_drones dlb ON dlb.guid = d.dlb_guid
  WHERE d.retired_at IS NULL
  -- ... repeat for each tenant as onboarded ...
;

CREATE UNIQUE INDEX idx_aadms_drones_callsign ON aadms.drones (callsign);
CREATE INDEX        idx_aadms_drones_serial   ON aadms.drones (serial_number);
Refresh strategy. Refreshed with REFRESH MATERIALIZED VIEW CONCURRENTLY aadms.drones at the end of each Import sync run — CONCURRENTLY keeps it queryable during refresh, which is why the unique index on callsign exists. Full FDW plumbing (foreign servers, user mappings, fdw_<tenant> schema imports) is in database/aadms-schema.sql, not repeated here.

Plain views — what they add, not what they store

drones.v_dlb_dronesdlb_drones with inventory_number → Callsign and identification_number → TC_Registration renamed for reporting. No new data.
drones.v_dtwin — joins dronesdlb_drones on dlb_guid. Every field listed in §3 above, plus the DLB identity fields (name, brand, model, TC reg, callsign, speeds, weight, etc). This is what the Custodian API, frontend, and MCP tools should all read from.

④ Design vs. Mockup — Gaps to Resolve

Compared the design (Aircraft_Custodian_dTwin_Strategy.html v1.13 + the deployed .sql files) against the current RTM Map mockup (fsl-rtm-map-mu.html). Five rows were resolved on 2026-08-20; the remaining CLEANUP rows are still open for the next dev sync.

#AreaDesign saysMockup doesWhat we need to decide
RESOLVED 2026-08-20 Vertical separation model FV/CV were 3D volumes: fv_lateral_buffer_m + fv_vertical_buffer_m, cv_lateral_buffer_m + cv_vertical_buffer_m. Horizontal only. Code comment: “FV/CV buffers — horizontal only; vertical separation is handled via NMAC/SWC below.” Decision: mockup's model wins. FV/CV are now fv_buffer_m / cv_buffer_m — horizontal only. Vertical separation is exclusively NMAC/SWC's job (see next row). The FV/CV/Submitted Volume polygons (now stored in flights_binding, not drones.oi_geometry — see the resolved row below) stay PolygonZ (real trajectory altitude per vertex) but are no longer vertically buffer-expanded. Schema and API docs updated in v1.12–v1.13 — see the strategy doc's changelog.
RESOLVED 2026-08-20 NMAC / SWC / EVAL shape Three flat scalars: nmac_distance_m, swc_distance_m, eval_distance_m. Eight fields: nmac_h_crewed_m, nmac_v_crewed_m, nmac_h_uncrewed_m, nmac_v_uncrewed_m, and the same four for SWC, plus eval_distance_m. Decision: mockup's model wins. Schema now carries the same 8 fields (crewed/uncrewed × horizontal/vertical) for NMAC and SWC; eval_distance_m stays a single scalar. Updated in drones.drones, v_dtwin, and the /separation-defaults API (v1.12).
RESOLVED 2026-08-20 Conspicuity / ADS-B detail fields drones.drones had 4 boolean flags only: adsb_in/out/surrogate_enabled, tisb_rebroadcast_enabled. Full “Conspicuity Configuration” panel: ec_callsign, ec_tc_reg, ec_adsb_hex, adsb_out_device, adsb_hex_mode, surveillance_mode, daa_enabled, broadcast_binding, networkid_streaming_enabled, observed status (adsb_observed), and a daa_rules[] array. Decision. ec_callsign/ec_tc_reg needed no new column — they're local mockup aliases for dlb_drones.inventory_number/identification_number, already Callsign/TC_Registration in v_dtwin. Everything else got real columns on drones.drones (§3: Conspicuity/ADS-B detail + Observed ADS-B state) plus a new drones.daa_rules table for daa_rules[] (v1.13).
RESOLVED 2026-08-20 Current mission / current OI 13 columns exist for this (v1.9): current_mission_id, current_flight_state, the flight/OI windows, waypoint progress, current_oi_id/state/source, regeneration timestamps. None of these appear anywhere in the mockup. Decision. Confirmed backend-only. RTM Map does not surface a manual OI-regenerate action or a current-mission/current-OI UI panel; regeneration is a Flink-driven backend process. No new columns were added to support a UI surface — the existing v1.9 columns remain API/MCP-facing (v1.13).
RESOLVED 2026-08-20 drones.oi_geometry table New table in the v1.11 design — stores flight_volume/contingency_volume/submitted_volume as real polygons. Not referenced. Also absent from both deployed .sql files. Decision: remove it from the design. drones.oi_geometry was never built and is now removed from both this page and the strategy doc. The three volumes for current/upcoming flights are persisted in the existing flights_binding table instead (v1.13) — see §1/§2/§3. flights_binding's own column schema isn't detailed in this doc.
CLEANUP Deployed schema is stale Aircraft_Custodian_dTwin_Strategy.html is at v1.13. (not mockup — deployed SQL) rtm-tenant-schema.sql and aadms-schema.sql both still header-reference “v1.6.” They're missing every v1.7–v1.13 addition (waypoint/pilot/separation/data-source/current-mission/OI fields, the new conspicuity/ADS-B columns, and the daa_rules table) and still use the old scalar flight_volume_m/contingency_vol_m and keycloak_client_id instead of the current fv_buffer_m/cv_buffer_m and 8-field crewed/uncrewed NMAC/SWC model. (There is no oi_geometry to migrate — it was removed from the design in v1.13; see the resolved row above.) Write and run a migration bringing both tenant and AADMS databases up to the current design before any more UI work locks in the old shape.
CLEANUP keycloak_client_id still in deployed SQL Removed from drones.drones in the design doc this week — the ID is fully derivable as tenant_id + "-" + serial_number, so it never needed to be a stored column. Mockup never had this field (no change needed there). rtm-tenant-schema.sql still declares the column. Drop it in the same migration as above. Also update the GET /drones/{serial}/identity endpoint description so it says “computed” rather than implying a stored field.
CLEANUP adapter_type enum mismatch Design doc comment: mavlink | dji_fh2 | dronesense. Deployed SQL comment: mavlink | dji_fh2 | dji_cloud | dronesense — one extra value, and they disagree with each other. UI dropdown offers DJI / MAVLink / “ADS-B Out” — treating ADS-B as a fourth adapter personality, when adsb_out_enabled already exists as an independent flag that can combine with any adapter. Agree one canonical enum (needs dji_cloud resolved either way), and fix the mockup so ADS-B Out isn't modeled as mutually exclusive with the telemetry adapter.
CLEANUP Legacy duplicate fields in mockup Superseded by adapter_type + adapter_config (JSONB) since v1.6. Mockup data still carries personality, agent_deployed, agent_location, telemetry_source, dji_org_id, dronesense_url/api_key, mavlink_ip/port/protocol, open_hex_mode/static — flagged in its own code comment as “Legacy compat fields kept for filter functions.” Find what filter logic still reads these, migrate it to adapter_type/adapter_config, then delete. Self-identified by the mockup author — just needs to be scheduled.
CLEANUP Custodian runtime/deployment status No columns for this — only adapter_connected (bool) + last_telemetry_at exist. UI shows custodian_deployed, custodian_configured, custodian_runtime, gcs_plugin, gcs_plugin_status as if they were persisted state. Confirm these are meant to be derived at request time (e.g. from a live health check) rather than stored — if so, document that; if not, they need columns.
CLEANUP Altitude reference drones.drones.position_alt — a single altitude value. Mockup's dtwin_state.position carries both alt_msl and alt_agl separately. OI/geometry math needs to know which reference it's getting. Decide whether drones.drones needs one column or two.
CONFIRMED OK link_rssi_dbm, aadms_id Both exist on drones.drones / v_dtwin. Neither appears anywhere in the mockup UI. No conflict — just confirm this is intentional (backend/API-only fields, not meant for this screen) rather than something forgotten.

⑤ Recommended Next Steps

  1. Migrate the deployed schema (rtm-tenant-schema.sql, aadms-schema.sql) from v1.6 to the current v1.13 design: drop keycloak_client_id; add the v1.7–v1.13 columns, including fv_buffer_m/cv_buffer_m, the 8 crewed/uncrewed NMAC/SWC fields, and the new conspicuity/ADS-B columns; create drones.daa_rules. No oi_geometry to add — it's been removed from the design in favor of flights_binding.
  2. Retire the mockup's legacy compat fields once the filter logic that depends on them is moved to adapter_type/adapter_config.
  3. Reconcile the adapter_type enum and stop modeling ADS-B Out as an adapter personality.