diff --git a/AGENTS.md b/AGENTS.md index 0fa0dbd..cf01398 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -139,6 +139,8 @@ MeshCore firmware can encode path hops as 1-byte, 2-byte, or 3-byte identifiers. - `GET /api/radio/config` exposes both the current `path_hash_mode` and `path_hash_mode_supported`. - `PATCH /api/radio/config` may update `path_hash_mode` only when the connected firmware supports it. - Contact routing now uses canonical route fields: `direct_path`, `direct_path_len`, `direct_path_hash_mode`, plus optional `route_override_*`. +- The contact/API surface also exposes backend-computed `effective_route`, `effective_route_source`, `direct_route`, and `route_override` so send logic and UI do not reimplement precedence rules independently. +- Legacy `last_path`, `last_path_len`, and `out_path_hash_mode` are no longer part of the contact model or API contract. - Route precedence for direct-message sends is: explicit override, then learned direct route, then flood. - The learned direct route is sourced from radio contact sync (`out_path`) and PATH/path-discovery updates, matching how firmware updates `ContactInfo.out_path`. - Advertisement paths are informational only. They are retained in `contact_advert_paths` for the contact pane and visualizer, but they are not used as DM send routes. diff --git a/app/AGENTS.md b/app/AGENTS.md index 9cef9b2..186b1da 100644 --- a/app/AGENTS.md +++ b/app/AGENTS.md @@ -271,6 +271,13 @@ Main tables: - `contact_name_history` (tracks name changes over time) - `app_settings` +Contact route state is canonicalized on the backend: +- stored route inputs: `direct_path`, `direct_path_len`, `direct_path_hash_mode`, `direct_path_updated_at`, plus optional `route_override_*` +- computed route surface: `effective_route`, `effective_route_source`, `direct_route`, `route_override` +- removed legacy names: `last_path`, `last_path_len`, `out_path_hash_mode` + +Frontend and send paths should consume the canonical route surface rather than reconstructing precedence from raw fields. + Repository writes should prefer typed models such as `ContactUpsert` over ad hoc dict payloads when adding or updating schema-coupled data. `max_radio_contacts` is the configured radio contact capacity baseline. Favorites reload first, the app refills non-favorite working-set contacts to about 80% of that capacity, and periodic offload triggers once occupancy reaches about 95%. diff --git a/frontend/AGENTS.md b/frontend/AGENTS.md index d96d0c6..966a71d 100644 --- a/frontend/AGENTS.md +++ b/frontend/AGENTS.md @@ -340,9 +340,10 @@ Clicking a contact's avatar in `ChatHeader` or `MessageList` opens a `ContactInf - Name history ("Also Known As") — shown only when the contact has used multiple names - Message stats: DM count, channel message count - Most active rooms (clickable → navigate to channel) +- Route details from the canonical backend surface (`effective_route`, `effective_route_source`, `direct_route`, `route_override`) - Advert observation rate - Nearest repeaters (resolved from first-hop path prefixes) -- Recent advert paths +- Recent advert paths (informational only; not part of DM route selection) State: `useConversationNavigation` controls open/close via `infoPaneContactKey`. Live contact data from WebSocket updates is preferred over the initial detail snapshot.