mirror of
https://github.com/vicliu624/trail-mate.git
synced 2026-09-09 13:35:32 +00:00
878 lines
36 KiB
JSON
878 lines
36 KiB
JSON
{
|
||
"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": []
|
||
}
|