Files
trail-mate/docs/models/model-registry.json
T

878 lines
36 KiB
JSON
Raw Blame History

This file contains invisible Unicode characters
This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
{
"schemaVersion": "praxis.umlModelRegistry.v1",
"principles": [
"Models are divided by domain language, state ownership, and invariants, not by document templates.",
"Domain models that exist but are not discovered by the tool should supplement the evidence and must not be falsely reported as the model does not exist.",
"Domain models that are missing due to design flaws enter the Review Queue and do not need to be covered up by empty shell models.",
"Design, Engineering and C4 are reading projections of the domain model, not three fixed top-level models."
],
"models": [
{
"id": "model:communication-conversation",
"kind": "domain",
"title": "Communication, session and delivery models",
"viewpoint": "How a message acquires a stable identity, enters a conversation, and undergoes a verifiable delivery lifecycle.",
"purpose": "Unify the message semantics visible to users while retaining the line protocol differences of Meshtastic, MeshCore and Reticulum.",
"authority": "The message ledger of core_chat and the receiving and submitting execution flow of core_mesh.",
"status": "confirmed",
"docPath": "docs/models/communication-conversation/model.md",
"htmlPath": "docs/models/communication-conversation/model.html",
"elements": [
{
"id": "element:chat-message",
"kind": "class",
"role": "classifier",
"name": "ChatMessage",
"packagePath": "Communication/Conversation",
"summary": "Unified message recording across protocols; separation of message identity and wireless frame identity.",
"status": "confirmed",
"confidence": "high",
"sourcePaths": [
"modules/core_chat/include/chat/domain/chat_types.h"
]
},
{
"id": "element:conversation",
"kind": "class",
"role": "classifier",
"name": "ConversationId / ConversationMeta",
"packagePath": "Communication/Conversation",
"summary": "Identifies the session by protocol, channel, peer, or Reticulum destination and saves list projection metadata.",
"status": "confirmed",
"confidence": "high",
"sourcePaths": [
"modules/core_chat/include/chat/domain/chat_types.h"
]
},
{
"id": "element:message-ledger",
"kind": "component",
"role": "classifier",
"name": "ChatMessageLedger",
"packagePath": "Communication/Delivery",
"summary": "The only submission entry for delivery status, merging duplicate events and protecting the final state.",
"status": "confirmed",
"confidence": "high",
"sourcePaths": [
"modules/core_chat/include/chat/delivery/chat_message_ledger.h",
"modules/core_chat/src/delivery/chat_message_ledger.cpp"
]
},
{
"id": "element:receive-packet",
"kind": "component",
"role": "classifier",
"name": "ReceivePacketService",
"packagePath": "Communication/Protocol Boundary",
"summary": "Verify received packets and submit protocol facts as communication facts.",
"status": "confirmed",
"confidence": "high",
"sourcePaths": [
"modules/core_mesh/include/mesh/usecase/receive_packet_service.h",
"modules/core_mesh/src/usecase/receive_packet_service.cpp"
]
}
],
"diagrams": [
{
"id": "diagram:message-delivery-lifecycle",
"kind": "state_machine",
"title": "MessageStatus and Ledger persistence",
"summary": "Distinguish message status in code from Durable/Deferred/Rejected persistence results.",
"packagePath": "Communication/Delivery",
"docPath": "docs/models/communication-conversation/message-delivery-lifecycle.md",
"htmlPath": "docs/models/communication-conversation/message-delivery-lifecycle.html",
"status": "confirmed",
"confidence": "high",
"representedElements": [
"element:chat-message",
"element:conversation",
"element:message-ledger",
"element:receive-packet"
]
}
]
},
{
"id": "model:mesh-network-identity",
"kind": "domain",
"title": "Mesh local identity and peer public key",
"viewpoint": "How to establish the local key and how to query, save and prevent unverified overwriting of the peer public key.",
"purpose": "Describe the LocalIdentity and PeerPublicKey that actually exist in the code; do not exaggerate this as a complete contact identity model.",
"authority": "Core_mesh's LocalIdentity, PeerPublicKey, corresponding stores and PeerIdentityService.",
"status": "confirmed",
"docPath": "docs/models/mesh-network-identity/model.md",
"htmlPath": "docs/models/mesh-network-identity/model.html",
"elements": [
{
"id": "element:local-identity",
"kind": "class",
"role": "classifier",
"name": "LocalIdentity",
"packagePath": "Mesh/Identity/Local",
"summary": "The device's own stable identity and protocol-available materials.",
"status": "confirmed",
"confidence": "high",
"sourcePaths": [
"modules/core_mesh/include/mesh/domain/local_identity.h"
]
},
{
"id": "element:peer-identity",
"kind": "class",
"role": "classifier",
"name": "PeerPublicKey",
"packagePath": "Mesh/Identity/Peer",
"summary": "The peer key record consisting of NodeId, public key, update time and verified flag.",
"status": "confirmed",
"confidence": "high",
"sourcePaths": [
"modules/core_mesh/include/mesh/domain/peer_identity.h"
]
},
{
"id": "element:peer-identity-service",
"kind": "component",
"role": "classifier",
"name": "PeerIdentityService",
"packagePath": "Mesh/Identity/Peer",
"summary": "Create native identities, find peer keys, and prevent unverified keys from overwriting verified keys.",
"status": "confirmed",
"confidence": "high",
"sourcePaths": [
"modules/core_mesh/include/mesh/usecase/peer_identity_service.h",
"modules/core_mesh/src/usecase/peer_identity_service.cpp"
]
},
{
"id": "element:local-identity-store",
"kind": "port",
"role": "internal_structure",
"name": "ILocalIdentityStore",
"packagePath": "Mesh/Identity/Ports",
"summary": "Isolated identity persistence mechanism.",
"status": "confirmed",
"confidence": "high",
"sourcePaths": [
"modules/core_mesh/include/mesh/ports/i_local_identity_store.h"
]
}
],
"diagrams": [
{
"id": "diagram:identity-resolution",
"kind": "activity",
"title": "Local identity establishment and peer public key protection",
"summary": "Show ensureLocalIdentity and verified PeerPublicKey replacement rules.",
"packagePath": "Mesh/Identity",
"docPath": "docs/models/mesh-network-identity/identity-resolution.md",
"htmlPath": "docs/models/mesh-network-identity/identity-resolution.html",
"status": "confirmed",
"confidence": "high",
"representedElements": [
"element:local-identity",
"element:peer-identity",
"element:peer-identity-service",
"element:local-identity-store"
]
}
]
},
{
"id": "model:contact-peer-directory",
"kind": "domain",
"title": "Contacts, peer directories and local trust",
"viewpoint": "Protocol observations are made into local peer records, and users can save nodes as contacts, ignore nodes, or confirm local trust.",
"purpose": "Separate directory identities, protocol facts, observation facts, and user facts; make it clear that contact lifecycle does not belong to message delivery, nor is it equivalent to Mesh public key identity.",
"authority": "MeshPeerRecord, IMeshPeerDirectory, ContactService, INodeStore and IContactStore of core_chat.",
"status": "confirmed",
"docPath": "docs/models/contact-peer-directory/model.md",
"htmlPath": "docs/models/contact-peer-directory/model.html",
"elements": [
{
"id": "element:mesh-peer-directory-identity",
"kind": "class",
"role": "classifier",
"name": "MeshPeerIdentity",
"packagePath": "Directory/Identity",
"summary": "A valid directory key consisting of protocol and NodeId, public key, or Reticulum destination.",
"status": "confirmed",
"confidence": "high",
"sourcePaths": [
"modules/core_chat/include/chat/domain/mesh_peer_directory.h"
]
},
{
"id": "element:mesh-peer-record",
"kind": "class",
"role": "classifier",
"name": "MeshPeerRecord",
"packagePath": "Directory/Record",
"summary": "Separate peer logging of protocol facts, wireless observations, first/last seen and native user flags.",
"status": "confirmed",
"confidence": "high",
"sourcePaths": [
"modules/core_chat/include/chat/domain/mesh_peer_directory.h"
]
},
{
"id": "element:contact-service",
"kind": "component",
"role": "classifier",
"name": "ContactService",
"packagePath": "Directory/Contact",
"summary": "Manage protocol partitioning, nickname, nearby/ignore classification, human verification, and node deletion semantics.",
"status": "confirmed",
"confidence": "high",
"sourcePaths": [
"modules/core_chat/include/chat/usecase/contact_service.h",
"modules/core_chat/src/usecase/contact_service.cpp"
]
},
{
"id": "element:contact-node-projection",
"kind": "class",
"role": "classifier",
"name": "NodeInfo / NodeUpdate",
"packagePath": "Directory/Projection",
"summary": "Node, location, device metrics, and user state projections used by legacy contact paths.",
"status": "confirmed",
"confidence": "high",
"sourcePaths": [
"modules/core_chat/include/chat/domain/contact_types.h",
"modules/core_chat/include/chat/ports/i_node_store.h"
]
},
{
"id": "element:peer-directory-ports",
"kind": "port",
"role": "internal_structure",
"name": "IMeshPeerDirectory / INodeStore / IContactStore",
"packagePath": "Directory/Ports",
"summary": "The unified peer directory, node observation and contact nickname are saved separately; currently there are still dual expressions.",
"status": "confirmed",
"confidence": "high",
"sourcePaths": [
"modules/core_chat/include/chat/ports/i_mesh_peer_directory.h",
"modules/core_chat/include/chat/ports/i_node_store.h",
"modules/core_chat/include/chat/ports/i_contact_store.h"
]
}
],
"diagrams": [
{
"id": "diagram:peer-directory-lifecycle",
"kind": "activity",
"title": "Peer observation, contact promotion and local trust",
"summary": "Distinguish between protocol observations, directory records, contact nicknames, ignored/trusted, and different deletion semantics.",
"packagePath": "Directory",
"docPath": "docs/models/contact-peer-directory/peer-directory-lifecycle.md",
"htmlPath": "docs/models/contact-peer-directory/peer-directory-lifecycle.html",
"status": "confirmed",
"confidence": "high",
"representedElements": [
"element:mesh-peer-directory-identity",
"element:mesh-peer-record",
"element:contact-service",
"element:contact-node-projection",
"element:peer-directory-ports"
]
}
]
},
{
"id": "model:team-coordination",
"kind": "domain",
"title": "Team Credentials, Matchmaking Status, and Collaboration Messages",
"viewpoint": "How TeamKeys, Leader/Member pairing status, and Beacon/Join/Key messages establish team credentials.",
"purpose": "Confirm pairing process manager with purpose-separated key; explicit member aggregate not yet formed.",
"authority": "core_team's TeamKeys, TeamPairingState, TeamPairingCoordinator and wire types.",
"status": "candidate",
"docPath": "docs/models/team-coordination/model.md",
"htmlPath": "docs/models/team-coordination/model.html",
"elements": [
{
"id": "element:team",
"kind": "class",
"role": "classifier",
"name": "TeamId / TeamKeys",
"packagePath": "Team/Credentials",
"summary": "Team ID, key_id and four types of keys: management, position, waypoint, and chat.",
"status": "confirmed",
"confidence": "high",
"sourcePaths": [
"modules/core_team/include/team/domain/team_types.h"
]
},
{
"id": "element:team-member",
"kind": "state_machine",
"role": "owned_behavior",
"name": "TeamPairingRole / TeamPairingState",
"packagePath": "Team/Pairing",
"summary": "Leader/Member role and Idle, Beacon, Scanning, JoinSent, WaitingKey, Completed, Failed status.",
"status": "confirmed",
"confidence": "high",
"sourcePaths": [
"modules/core_team/include/team/domain/team_types.h"
]
},
{
"id": "element:team-pairing-coordinator",
"kind": "component",
"role": "classifier",
"name": "TeamPairingCoordinator",
"packagePath": "Team/Pairing",
"summary": "Coordinate pairing transport, crypto, events and team updates.",
"status": "confirmed",
"confidence": "high",
"sourcePaths": [
"modules/core_team/include/team/usecase/team_pairing_coordinator.h",
"modules/core_team/src/usecase/team_pairing_coordinator.cpp"
]
},
{
"id": "element:team-wire",
"kind": "class",
"role": "classifier",
"name": "Team Wire Messages",
"packagePath": "Team/Sharing",
"summary": "Protocol values for location, trajectory, landmarks, management and chat.",
"status": "confirmed",
"confidence": "high",
"sourcePaths": [
"modules/core_team/include/team/protocol/team_position.h",
"modules/core_team/include/team/protocol/team_track.h",
"modules/core_team/include/team/protocol/team_waypoint.h",
"modules/core_team/include/team/protocol/team_mgmt.h"
]
}
],
"diagrams": [
{
"id": "diagram:team-pairing",
"kind": "sequence",
"title": "Leader/Member pairing message exchange",
"summary": "Display paired collaboration according to the coordinator's Beacon, Join, and Key handler.",
"packagePath": "Team/Pairing",
"docPath": "docs/models/team-coordination/team-pairing.md",
"htmlPath": "docs/models/team-coordination/team-pairing.html",
"status": "confirmed",
"confidence": "high",
"representedElements": [
"element:team",
"element:team-member",
"element:team-pairing-coordinator",
"element:team-wire"
]
}
]
},
{
"id": "model:positioning-time",
"kind": "domain",
"title": "GNSS positioning, jump filtering and time update",
"viewpoint": "How NMEA revision becomes LocationFix, location events and time updates via GpsJitterFilter.",
"purpose": "Let consumers obtain the location through LocationService instead of parsing the driver status individually; route navigation is another missing model.",
"authority": "LocationService for core_gps.",
"status": "confirmed",
"docPath": "docs/models/positioning-time/model.md",
"htmlPath": "docs/models/positioning-time/model.html",
"elements": [
{
"id": "element:gps-snapshot",
"kind": "class",
"role": "classifier",
"name": "LocationFix",
"packagePath": "Positioning/Fix",
"summary": "The positioning fix outputted by the domain boundary, rather than the GPS snapshot assembled by the UI itself.",
"status": "confirmed",
"confidence": "high",
"sourcePaths": [
"modules/core_gps/include/gps/domain/location_fix.h"
]
},
{
"id": "element:location-service",
"kind": "component",
"role": "classifier",
"name": "LocationService",
"packagePath": "Positioning/Fix",
"summary": "Maintain the last valid location and determine snapshot quality and freshness.",
"status": "confirmed",
"confidence": "high",
"sourcePaths": [
"modules/core_gps/include/gps/usecase/location_service.h",
"modules/core_gps/src/usecase/location_service.cpp"
]
},
{
"id": "element:fix-validity",
"kind": "component",
"role": "classifier",
"name": "GpsJitterFilter",
"packagePath": "Positioning/Filtering",
"summary": "Apply transition filtering to the GNSS fix; it is a policy object that exists explicitly in the code.",
"status": "confirmed",
"confidence": "high",
"sourcePaths": [
"modules/core_gps/include/gps/usecase/gps_jitter_filter.h"
]
},
{
"id": "element:gnss-time-authority",
"kind": "port",
"role": "internal_structure",
"name": "ITimeAuthorityUpdater",
"packagePath": "Positioning/Time",
"summary": "LocationService Port for submitting GNSS time facts to the system time authority.",
"status": "confirmed",
"confidence": "high",
"sourcePaths": [
"modules/core_gps/include/gps/ports/i_time_authority.h"
]
}
],
"diagrams": [
{
"id": "diagram:fix-lifecycle",
"kind": "sequence",
"title": "GNSS revision processing chain",
"summary": "Demonstrate the real collaboration of NMEA revision, jitter filter, location event and time update.",
"packagePath": "Positioning/Fix",
"docPath": "docs/models/positioning-time/fix-lifecycle.md",
"htmlPath": "docs/models/positioning-time/fix-lifecycle.html",
"status": "confirmed",
"confidence": "high",
"representedElements": [
"element:gps-snapshot",
"element:location-service",
"element:fix-validity",
"element:gnss-time-authority"
]
}
]
},
{
"id": "model:track-recording",
"kind": "domain",
"title": "Track Recording and Persistence Model",
"viewpoint": "How recording sessions, sample points, bounded buffers, store commands, and failure recovery work together.",
"purpose": "Trajectories are guaranteed to be available, recoverable, and memory-bounded on resource-constrained devices.",
"authority": "TrackRuntime and TrackStateMachine of core_gps.",
"status": "confirmed",
"docPath": "docs/models/track-recording/model.md",
"htmlPath": "docs/models/track-recording/model.html",
"elements": [
{
"id": "element:track-runtime",
"kind": "class",
"role": "classifier",
"name": "TrackRuntime",
"packagePath": "Track/Session",
"summary": "Traces the session's memory state and resource ownership.",
"status": "confirmed",
"confidence": "high",
"sourcePaths": [
"modules/core_gps/include/gps/track_runtime.h"
]
},
{
"id": "element:track-state-machine",
"kind": "state_machine",
"role": "owned_behavior",
"name": "TrackStateMachine",
"packagePath": "Track/Session",
"summary": "Centralized execution of recording commands and legal status migration.",
"status": "confirmed",
"confidence": "high",
"sourcePaths": [
"modules/core_gps/include/gps/track_runtime.h"
]
},
{
"id": "element:track-command-queue",
"kind": "component",
"role": "classifier",
"name": "Track Storage Command Queue",
"packagePath": "Track/Buffer",
"summary": "Isolate sampling hot paths from persistence with fixed-depth command slots.",
"status": "confirmed",
"confidence": "high",
"sourcePaths": [
"modules/core_gps/include/gps/track_runtime.h"
]
},
{
"id": "element:track-storage-worker",
"kind": "component",
"role": "classifier",
"name": "TrackStorageWorker",
"packagePath": "Track/Storage",
"summary": "Consumes storage commands and reports success or explicit failure.",
"status": "confirmed",
"confidence": "high",
"sourcePaths": [
"modules/core_gps/include/gps/track_runtime.h"
]
}
],
"diagrams": [
{
"id": "diagram:track-recording-session",
"kind": "state_machine",
"title": "TrackCommand / TrackEvent / RecorderStatus",
"summary": "Only show the commands, events and states that actually exist in the code, without adding Pause/Resume.",
"packagePath": "Track/Session",
"docPath": "docs/models/track-recording/track-recording-session.md",
"htmlPath": "docs/models/track-recording/track-recording-session.html",
"status": "confirmed",
"confidence": "high",
"representedElements": [
"element:track-runtime",
"element:track-state-machine",
"element:track-command-queue",
"element:track-storage-worker"
]
}
]
},
{
"id": "model:device-target-capability",
"kind": "domain",
"title": "Device Goals, Capabilities, and Authoritative Models",
"viewpoint": "What capabilities the hardware target has, whether the capabilities are currently available, and who has control.",
"purpose": "Avoid mistaking successful compilation for feature availability and give clear reasons for unavailability/downgrade.",
"authority": "TargetManifestView, CapabilityStatus and AuthorityBinding of core_device.",
"status": "confirmed",
"docPath": "docs/models/device-target-capability/model.md",
"htmlPath": "docs/models/device-target-capability/model.html",
"elements": [
{
"id": "element:target-manifest",
"kind": "class",
"role": "classifier",
"name": "TargetManifestView",
"packagePath": "Device/Target",
"summary": "Target identity, board-level characteristics, and product capability contracts.",
"status": "confirmed",
"confidence": "high",
"sourcePaths": [
"modules/core_device/include/device/target_manifest_types.h"
]
},
{
"id": "element:capability-kind",
"kind": "class",
"role": "classifier",
"name": "CapabilityKind",
"packagePath": "Device/Capability",
"summary": "Stable capability vocabulary that the product can discuss.",
"status": "confirmed",
"confidence": "high",
"sourcePaths": [
"modules/core_device/include/device/capability_types.h"
]
},
{
"id": "element:capability-status",
"kind": "class",
"role": "classifier",
"name": "CapabilityStatus",
"packagePath": "Device/Capability",
"summary": "Capability status and explicit reasons for unavailability/degradation.",
"status": "confirmed",
"confidence": "high",
"sourcePaths": [
"modules/core_device/include/device/capability_types.h",
"modules/core_device/src/device/capability_types.cpp"
]
},
{
"id": "element:authority-binding",
"kind": "class",
"role": "classifier",
"name": "AuthorityBinding",
"packagePath": "Device/Authority",
"summary": "Binding of resource capabilities to the current authoritative owner.",
"status": "confirmed",
"confidence": "high",
"sourcePaths": [
"modules/core_device/include/device/authority_types.h"
]
}
],
"diagrams": [
{
"id": "diagram:capability-resolution",
"kind": "activity",
"title": "Target capability analysis",
"summary": "Static manifests work with runtime authority to determine feature availability.",
"packagePath": "Device/Capability",
"docPath": "docs/models/device-target-capability/capability-resolution.md",
"htmlPath": "docs/models/device-target-capability/capability-resolution.html",
"status": "confirmed",
"confidence": "high",
"representedElements": [
"element:target-manifest",
"element:capability-kind",
"element:capability-status",
"element:authority-binding"
]
}
]
},
{
"id": "model:hostlink-integration",
"kind": "integration",
"title": "HostLink session state and frame routing",
"viewpoint": "How SessionRuntime, LinkState, frame decisions and codecs form the boundary between master and C6.",
"purpose": "Use real states and functions to describe handshakes, sequence numbers, throttling, disconnection, and frame classification.",
"authority": "core_hostlink's SessionRuntime, LinkState, HostlinkFrameDecision and codecs.",
"status": "confirmed",
"docPath": "docs/models/hostlink-integration/model.md",
"htmlPath": "docs/models/hostlink-integration/model.html",
"elements": [
{
"id": "element:c6-frame",
"kind": "class",
"role": "classifier",
"name": "C6 Frame",
"packagePath": "HostLink/Frame",
"summary": "A bounded, verifiable unit of messages transferred across processors.",
"status": "confirmed",
"confidence": "high",
"sourcePaths": [
"modules/core_hostlink/include/hostlink/c6/c6_protocol.h",
"modules/core_hostlink/include/hostlink/c6/c6_frame_codec.h"
]
},
{
"id": "element:hostlink-session",
"kind": "class",
"role": "classifier",
"name": "SessionRuntime / LinkState",
"packagePath": "HostLink/Session",
"summary": "Stopped, Waiting, Connected, Handshaking, Ready, Error and sequence number and timeout status.",
"status": "confirmed",
"confidence": "high",
"sourcePaths": [
"modules/core_hostlink/include/hostlink/hostlink_session.h",
"modules/core_hostlink/src/hostlink_session.cpp"
]
},
{
"id": "element:hostlink-router",
"kind": "component",
"role": "classifier",
"name": "HostlinkFrameRouter",
"packagePath": "HostLink/Routing",
"summary": "Hands authenticated frames to a single handler by specific type.",
"status": "confirmed",
"confidence": "high",
"sourcePaths": [
"modules/core_hostlink/include/hostlink/hostlink_frame_router.h",
"modules/core_hostlink/src/hostlink_frame_router.cpp"
]
},
{
"id": "element:hostlink-codecs",
"kind": "component",
"role": "classifier",
"name": "HostLink Codecs",
"packagePath": "HostLink/Routing",
"summary": "Explicit boundary translation of services, configurations, events, and app data.",
"status": "confirmed",
"confidence": "high",
"sourcePaths": [
"modules/core_hostlink/include/hostlink/hostlink_service_codec.h",
"modules/core_hostlink/include/hostlink/hostlink_event_codec.h",
"modules/core_hostlink/include/hostlink/hostlink_config_codec.h"
]
}
],
"diagrams": [
{
"id": "diagram:hostlink-session",
"kind": "state_machine",
"title": "LinkState and handshake life cycle",
"summary": "Use the true status of Stopped, Waiting, Connected, Handshaking, Ready, Error.",
"packagePath": "HostLink/Session",
"docPath": "docs/models/hostlink-integration/hostlink-session.md",
"htmlPath": "docs/models/hostlink-integration/hostlink-session.html",
"status": "confirmed",
"confidence": "high",
"representedElements": [
"element:c6-frame",
"element:hostlink-session",
"element:hostlink-router",
"element:hostlink-codecs"
]
}
]
},
{
"id": "model:phone-interoperability",
"kind": "integration",
"title": "Mobile application protocol interoperability",
"viewpoint": "How IPhoneAppFacade provides a common contract to applications while retaining the thread semantics of both protocol cores.",
"purpose": "Unify the time/location/status/config/command visible to the application, but do not unify the wire models of Meshtastic and MeshCore.",
"authority": "core_phone's IPhoneAppFacade, Phone IO and Meshtastic/MeshCore phone cores.",
"status": "confirmed",
"docPath": "docs/models/phone-interoperability/model.md",
"htmlPath": "docs/models/phone-interoperability/model.html",
"elements": [
{
"id": "element:phone-io",
"kind": "port",
"role": "internal_structure",
"name": "Phone IO",
"packagePath": "Phone/Session",
"summary": "Isolate external transmissions such as BLE/serial.",
"status": "confirmed",
"confidence": "high",
"sourcePaths": [
"modules/core_phone/include/phone/common/phone_io.h"
]
},
{
"id": "element:phone-facade",
"kind": "interface",
"role": "classifier",
"name": "IPhoneAppFacade",
"packagePath": "Phone/Facade",
"summary": "Protocol-independent interface that exposes time, location, device status, configuration patches, and typed commands to applications.",
"status": "confirmed",
"confidence": "high",
"sourcePaths": [
"modules/core_phone/include/phone/common/phone_facade.h",
"modules/core_phone/include/phone/common/phone_app_facade.h"
]
},
{
"id": "element:meshtastic-phone",
"kind": "component",
"role": "classifier",
"name": "MeshtasticPhoneCore",
"packagePath": "Phone/Protocol",
"summary": "Messaging, configuration and session behavior for the Meshtastic mobile protocol.",
"status": "confirmed",
"confidence": "high",
"sourcePaths": [
"modules/core_phone/include/phone/meshtastic/meshtastic_phone_core.h",
"modules/core_phone/src/meshtastic/meshtastic_phone_core.cpp"
]
},
{
"id": "element:meshcore-phone",
"kind": "component",
"role": "classifier",
"name": "MeshCorePhoneCore",
"packagePath": "Phone/Protocol",
"summary": "MeshCore mobile protocol behavior, separated from Meshtastic thread semantics.",
"status": "confirmed",
"confidence": "high",
"sourcePaths": [
"modules/core_phone/include/phone/meshcore/meshcore_phone_core.h",
"modules/core_phone/src/meshcore/meshcore_phone_core.cpp"
]
}
],
"diagrams": [
{
"id": "diagram:phone-session",
"kind": "sequence",
"title": "IPhoneAppFacade to protocol core",
"summary": "Boundaries between common application commands and Meshtastic/MeshCore-specific protocol behavior.",
"packagePath": "Phone/Session",
"docPath": "docs/models/phone-interoperability/phone-session.md",
"htmlPath": "docs/models/phone-interoperability/phone-session.html",
"status": "confirmed",
"confidence": "high",
"representedElements": [
"element:phone-io",
"element:phone-facade",
"element:meshtastic-phone",
"element:meshcore-phone"
]
}
]
}
],
"traces": [
{
"id": "trace:identity-to-directory",
"relation": "trace",
"sourceId": "model:mesh-network-identity",
"targetId": "model:contact-peer-directory",
"sourceModelId": "model:mesh-network-identity",
"targetModelId": "model:contact-peer-directory",
"summary": "The mesh key model provides verified peer keys; directories preserve their native indexes and user projections, but attestation semantics are not yet unified."
},
{
"id": "trace:directory-to-conversation",
"relation": "realize",
"sourceId": "model:contact-peer-directory",
"targetId": "model:communication-conversation",
"sourceModelId": "model:contact-peer-directory",
"targetModelId": "model:communication-conversation",
"summary": "The session reads the contact display name and origin trust projection, but does not own the contact lifecycle."
},
{
"id": "trace:directory-to-team",
"relation": "refine",
"sourceId": "model:contact-peer-directory",
"targetId": "model:team-coordination",
"sourceModelId": "model:contact-peer-directory",
"targetModelId": "model:team-coordination",
"summary": "Team rosters currently associate directories with NodeIds; mapping to stable TeamMember identities is still a design gap."
},
{
"id": "trace:conversation-to-team",
"relation": "realize",
"sourceId": "model:communication-conversation",
"targetId": "model:team-coordination",
"sourceModelId": "model:communication-conversation",
"targetModelId": "model:team-coordination",
"summary": "Communications carry team agreements but not membership."
},
{
"id": "trace:location-to-team",
"relation": "realize",
"sourceId": "model:positioning-time",
"targetId": "model:team-coordination",
"sourceModelId": "model:positioning-time",
"targetModelId": "model:team-coordination",
"summary": "Valid location drives policy-governed team location sharing."
},
{
"id": "trace:location-to-track",
"relation": "realize",
"sourceId": "model:positioning-time",
"targetId": "model:track-recording",
"sourceModelId": "model:positioning-time",
"targetModelId": "model:track-recording",
"summary": "Trajectories only accept position samples that pass the validity policy."
},
{
"id": "trace:capability-to-phone",
"relation": "refine",
"sourceId": "model:device-target-capability",
"targetId": "model:phone-interoperability",
"sourceModelId": "model:device-target-capability",
"targetModelId": "model:phone-interoperability",
"summary": "Target capabilities determine whether mobile phone interoperability is available and the reasons for degradation."
},
{
"id": "trace:capability-to-hostlink",
"relation": "refine",
"sourceId": "model:device-target-capability",
"targetId": "model:hostlink-integration",
"sourceModelId": "model:device-target-capability",
"targetModelId": "model:hostlink-integration",
"summary": "HostLink availability is determined by a combination of target capabilities and runtime sessions."
}
],
"projections": []
}