{"action":"created","comment":{"url":"https://api.github.com/repos/UAVCAN/specification/pulls/comments/238891154","pull_request_review_id":181536177,"id":238891154,"node_id":"MDI0OlB1bGxSZXF1ZXN0UmV2aWV3Q29tbWVudDIzODg5MTE1NA==","diff_hunk":"@@ -1,79 +1,209 @@\n \\chapter{Basic concepts}\\label{sec:basic_concepts}\n \n+\\section{Main principles}\n+\n+\\subsection{Communication}\n+\n+\\subsubsection{Architecture}\n \n A UAVCAN network is a decentralized peer network, where each peer (node) has a unique\n-numeric identifier --- \\emph{node ID} --- ranging from 1 to 127, inclusively.\n+numeric identifier\\footnote{Here and elsewhere in this specification, \\emph{ID} and \\emph{identifier} are used\n+interchangeably unless specifically indicated otherwise.}\n+--- \\emph{node ID} --- ranging from 1 to 127, inclusively.\n Nodes of a UAVCAN network can communicate using the following communication methods:\n \n \\begin{description}\n-    \\item[Message broadcasting] --- The primary method of data exchange with one-to-all publish/subscribe semantics.\n-    \\item[Service invocation] --- The communication method for peer-to-peer request/response\n+    \\item[Message publication] --- The primary method of data exchange with one-to-many publish/subscribe semantics.\n+    \\item[Service invocation] --- The communication method for one-to-one request/response\n     interactions\\footnote{Like remote procedure call (RPC).}.\n \\end{description}\n \n-For each type of communication, a predefined set of data structures is used,\n-where each data structure has a unique identifier --- the \\emph{data type ID} (DTID).\n-Additionally, every data structure definition has a pair of major and minor semantic version numbers,\n+For each type of communication, a predefined set of data types is used,\n+where each data type has a unique name.\n+Additionally, every data type definition has a pair of major and minor version numbers,\n which enable data type definitions to evolve in arbitrary ways while ensuring a well-defined\n migration path if backward-incompatible changes are introduced.\n-Some data structures are standard and defined by the protocol specification (of which only a small \n+Some data types are standard and defined by the protocol specification (of which only a small\n subset are required); others may be specific to a particular application or vendor.\n \n-Since every message or service data type has its own unique data type ID,\n-and each node in the network has its own unique node ID,\n-a pair of data type ID and node ID can be used to support redundant nodes with identical\n-functionality inside the same network.\n+\\subsubsection{Subjects and services}\n+\n+Message exchanges between nodes are grouped into \\emph{subjects} by their semantic meaning.\n+Message exchanges belonging to the same subject use same message data type down to the major version\n+(minor versions are allowed to differ) and pertain to same function or process within the system.\n+\n+Request/response exchanges between nodes are grouped into \\emph{services} by their semantic meaning,\n+like messages are grouped into subjects.\n+Requests and their corresponding responses that belong to the same service use same service data type down to\n+the major version (minor versions are allowed to differ; as a consequence, the minor data type version number\n+of a service response may differ from that of its corresponding request) and pertain to same function.\n+\n+Each message subject is identified by a unique natural number -- a \\emph{subject ID};\n+likewise, each service is identified by a unique \\emph{service ID}.\n+An umbrella term \\emph{port ID} is used to refer either to a subject ID or to a service ID\n+(port identifiers have no direct manifestation in the construction of the protocol,\n+but they are convenient for discussion).\n+\n+\\subsection{Data types}\n+\n+\\subsubsection{Data type definitions}\n+\n+Message and service data types\\footnote{Data types are the core concept of UAVCAN.}\n+are defined using the \\emph{data structure description language} (DSDL) (chapter \\ref{sec:dsdl}).\n+A DSDL definition specifies the name, major version, minor version, the data structure,\n+and an optional predefined port ID of the data type.\n+Message data types always contain exactly one data structure, whereas\n+service data types contain two data structures: one for request, and the other for response.\n+\n+If a port identifier is specified in a data type definition, such identifier is said to be a\n+\\emph{fixed port identifier}\n+(by inheritance, the same naming principle applies to \\emph{fixed subject ID} and \\emph{fixed service ID}).\n+A data type can be used with an arbitrary number of different port identifiers assigned on a per-application basis,\n+but not more than one fixed port identifier.\n+\n+\\subsubsection{Regulation}\n+\n+Data type definitions can be created by the UAVCAN specification maintainers or by its users,\n+such as equipment vendors or application designers.\n+Irrespective of the origin, data types can be included into the set of data type definitions maintained\n+and distributed by the UAVCAN specification maintainers;\n+definitions belonging to this set are termed \\emph{regulated data type definitions}.\n+The specification maintainers undertake to keep regulated definitions well-maintained and may occasionally\n+amend them and release new versions, if such actions are believed to benefit the protocol.\n+User-created (i.e., vendor-specific or application-specific) data type definitions that are\n+not included into the aforementioned set are called \\emph{unregulated data type definitions}.\n+\n+Unregulated definitions that are made available for reuse by others are called\n+\\emph{unregulated public data type definitions};\n+those that are kept closed-source for private use by their authors are called\n+\\emph{(unregulated) private data type definitions}\\footnote{The word \\emph{``unregulated''} is redundant\n+because private data types cannot be regulated, by definition.\n+Likewise, all regulated definitions are public, so the word \\emph{``public''} can be omitted.}.\n+\n+Data type definitions authored by the specification maintainers for the purpose of supporting and advancing\n+this specification are called \\emph{standard data type definitions}.\n+All standard data type definitions are regulated.\n+\n+Fixed port identifiers can be used only with regulated data type definitions or with private definitions.\n+Fixed port identifiers must not be used with public unregulated data types,\n+since that is likely to cause unresolvable port identifier collisions\\footnote{\n+    Any system that relies on data type definitions with fixed port identifiers provided by\n+    an external party (i.e., data types and the system in question are designed by different parties)\n+    runs the risk of encountering port identifier conflicts that cannot be resolved without resorting to help\n+    of such external party, since the designers of the system do not have control over their fixed port identifiers.\n+    This is why the specification strongly discourages the use of fixed unregulated private port identifiers.\n+    If a data type definition is ever disclosed to any other party (i.e., a party that did not author it)\n+    or to the public at large, such data type should be devoid of a fixed port identifier.\n+}.\n+This restriction shall be followed at all times by all compliant implementations and\n+systems\\footnote{\n+    In general, private unregulated fixed port identifiers are collision-prone by their nature, so they should\n+    be avoided unless there are very strong reasons for their usage and the authors fully understand the risks.\n+}.\n+\n+\\begin{UAVCANSimpleTable}{Data type taxonomy}{|l|X|X|}\n+    & Regulated & Unregulated \\\\\n+    \\bfseries{Public}\n+    &\n+    Standard and contributed (e.g., vendor-specific) definitions.\\newline\n+    Fixed port identifiers are allowed; they are called \\emph{``regulated port ID''}.\n+    &\n+    Definitions distributed separately from the UAVCAN specification.\\newline\n+    Fixed port identifiers are \\emph{not allowed}.\n+    \\\\\n+\n+    \\bfseries{Private}\n+    &\n+    Nonexistent category.\n+    &\n+    Definitions that are not available to anyone except their authors.\\newline\n+    Fixed port identifiers are permitted (although not recommended) as long as the definition is only used by\n+    its authors; they are called \\emph{``unregulated fixed port ID''}.\n+    \\\\\n+\\end{UAVCANSimpleTable}\n+\n+DSDL processing tools shall prohibit unregulated fixed port identifiers by default,\n+unless they are explicitly configured otherwise.\n+\n+Each of the two sets of valid port identifiers (which are subject identifiers and port identifiers) are\n+segregated into three categories: application-specific (i.e., non-fixed or unregulated) identifiers,\n+regulated non-standard port identifiers, and standard port identifiers.\n+Fixed unregulated port identifiers can be allocated in the same range where application-specific identifiers are.\n+The ranges are documented in chapter \\ref{sec:application_layer}.\n+\n+Data type authors that desire to release regulated data type definitions or contribute to the standard data\n+type set should contact the UAVCAN maintainers for coordination.\n+The maintainers will choose unoccupied fixed port identifiers for use with the new definitions, if necessary.\n+Since the set of regulated definitions is maintained in a highly centralized manner,\n+it can be statically ensured that no identifier collisions will take place within it;\n+also, since the identifier ranges used with regulated definitions are segregated from the rest,\n+regulated port ID will not conflict with any other compliant UAVCAN node or system\\footnote{","path":"specification/basic_concepts/basic_concepts.tex","position":151,"original_position":151,"commit_id":"dee725bdc328dd214980b14b8fb9c3249f9d13c0","original_commit_id":"dee725bdc328dd214980b14b8fb9c3249f9d13c0","user":{"login":"thirtytwobits","id":19180861,"node_id":"MDQ6VXNlcjE5MTgwODYx","avatar_url":"https://avatars2.githubusercontent.com/u/19180861?v=4","gravatar_id":"","url":"https://api.github.com/users/thirtytwobits","html_url":"https://github.com/thirtytwobits","followers_url":"https://api.github.com/users/thirtytwobits/followers","following_url":"https://api.github.com/users/thirtytwobits/following{/other_user}","gists_url":"https://api.github.com/users/thirtytwobits/gists{/gist_id}","starred_url":"https://api.github.com/users/thirtytwobits/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/thirtytwobits/subscriptions","organizations_url":"https://api.github.com/users/thirtytwobits/orgs","repos_url":"https://api.github.com/users/thirtytwobits/repos","events_url":"https://api.github.com/users/thirtytwobits/events{/privacy}","received_events_url":"https://api.github.com/users/thirtytwobits/received_events","type":"User","site_admin":false},"body":"```suggestion\r\nregulated port-IDs will not conflict with any other compliant UAVCAN node or system\\footnote{\r\n```\r\nIn general I'd use a hyphen when discussing types of port identifiers to be explicit about what term modifies which (e.g. is the port or the identifier regulated: \"regulated-port identifier\" or \"regulated port-identifier\")","created_at":"2018-12-05T00:23:01Z","updated_at":"2018-12-05T00:30:22Z","html_url":"https://github.com/UAVCAN/specification/pull/32#discussion_r238891154","pull_request_url":"https://api.github.com/repos/UAVCAN/specification/pulls/32","author_association":"CONTRIBUTOR","_links":{"self":{"href":"https://api.github.com/repos/UAVCAN/specification/pulls/comments/238891154"},"html":{"href":"https://github.com/UAVCAN/specification/pull/32#discussion_r238891154"},"pull_request":{"href":"https://api.github.com/repos/UAVCAN/specification/pulls/32"}}},"pull_request":{"url":"https://api.github.com/repos/UAVCAN/specification/pulls/32","id":229922923,"node_id":"MDExOlB1bGxSZXF1ZXN0MjI5OTIyOTIz","html_url":"https://github.com/UAVCAN/specification/pull/32","diff_url":"https://github.com/UAVCAN/specification/pull/32.diff","patch_url":"https://github.com/UAVCAN/specification/pull/32.patch","issue_url":"https://api.github.com/repos/UAVCAN/specification/issues/32","number":32,"state":"open","locked":false,"title":"Chapters 1 and 2","user":{"login":"pavel-kirienko","id":3298404,"node_id":"MDQ6VXNlcjMyOTg0MDQ=","avatar_url":"https://avatars2.githubusercontent.com/u/3298404?v=4","gravatar_id":"","url":"https://api.github.com/users/pavel-kirienko","html_url":"https://github.com/pavel-kirienko","followers_url":"https://api.github.com/users/pavel-kirienko/followers","following_url":"https://api.github.com/users/pavel-kirienko/following{/other_user}","gists_url":"https://api.github.com/users/pavel-kirienko/gists{/gist_id}","starred_url":"https://api.github.com/users/pavel-kirienko/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/pavel-kirienko/subscriptions","organizations_url":"https://api.github.com/users/pavel-kirienko/orgs","repos_url":"https://api.github.com/users/pavel-kirienko/repos","events_url":"https://api.github.com/users/pavel-kirienko/events{/privacy}","received_events_url":"https://api.github.com/users/pavel-kirienko/received_events","type":"User","site_admin":false},"body":"The first two chapters are virtually finished. I merely updated them according to our recent discussions, nothing new here. Note that the master branch is currently a staging branch, so the changes are not to be considered final after merging.\r\n\r\n[UAVCAN_Specification.pdf](https://github.com/UAVCAN/specification/files/2569794/UAVCAN_Specification.pdf)\r\n","created_at":"2018-11-11T00:37:53Z","updated_at":"2018-12-05T00:30:21Z","closed_at":null,"merged_at":null,"merge_commit_sha":"fac0ffec681af892ad28f3b968aec9c7366e4fb0","assignee":{"login":"pavel-kirienko","id":3298404,"node_id":"MDQ6VXNlcjMyOTg0MDQ=","avatar_url":"https://avatars2.githubusercontent.com/u/3298404?v=4","gravatar_id":"","url":"https://api.github.com/users/pavel-kirienko","html_url":"https://github.com/pavel-kirienko","followers_url":"https://api.github.com/users/pavel-kirienko/followers","following_url":"https://api.github.com/users/pavel-kirienko/following{/other_user}","gists_url":"https://api.github.com/users/pavel-kirienko/gists{/gist_id}","starred_url":"https://api.github.com/users/pavel-kirienko/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/pavel-kirienko/subscriptions","organizations_url":"https://api.github.com/users/pavel-kirienko/orgs","repos_url":"https://api.github.com/users/pavel-kirienko/repos","events_url":"https://api.github.com/users/pavel-kirienko/events{/privacy}","received_events_url":"https://api.github.com/users/pavel-kirienko/received_events","type":"User","site_admin":false},"assignees":[{"login":"pavel-kirienko","id":3298404,"node_id":"MDQ6VXNlcjMyOTg0MDQ=","avatar_url":"https://avatars2.githubusercontent.com/u/3298404?v=4","gravatar_id":"","url":"https://api.github.com/users/pavel-kirienko","html_url":"https://github.com/pavel-kirienko","followers_url":"https://api.github.com/users/pavel-kirienko/followers","following_url":"https://api.github.com/users/pavel-kirienko/following{/other_user}","gists_url":"https://api.github.com/users/pavel-kirienko/gists{/gist_id}","starred_url":"https://api.github.com/users/pavel-kirienko/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/pavel-kirienko/subscriptions","organizations_url":"https://api.github.com/users/pavel-kirienko/orgs","repos_url":"https://api.github.com/users/pavel-kirienko/repos","events_url":"https://api.github.com/users/pavel-kirienko/events{/privacy}","received_events_url":"https://api.github.com/users/pavel-kirienko/received_events","type":"User","site_admin":false}],"requested_reviewers":[{"login":"EShamaev","id":7996972,"node_id":"MDQ6VXNlcjc5OTY5NzI=","avatar_url":"https://avatars1.githubusercontent.com/u/7996972?v=4","gravatar_id":"","url":"https://api.github.com/users/EShamaev","html_url":"https://github.com/EShamaev","followers_url":"https://api.github.com/users/EShamaev/followers","following_url":"https://api.github.com/users/EShamaev/following{/other_user}","gists_url":"https://api.github.com/users/EShamaev/gists{/gist_id}","starred_url":"https://api.github.com/users/EShamaev/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/EShamaev/subscriptions","organizations_url":"https://api.github.com/users/EShamaev/orgs","repos_url":"https://api.github.com/users/EShamaev/repos","events_url":"https://api.github.com/users/EShamaev/events{/privacy}","received_events_url":"https://api.github.com/users/EShamaev/received_events","type":"User","site_admin":false}],"requested_teams":[],"labels":[],"milestone":{"url":"https://api.github.com/repos/UAVCAN/specification/milestones/1","html_url":"https://github.com/UAVCAN/specification/milestone/1","labels_url":"https://api.github.com/repos/UAVCAN/specification/milestones/1/labels","id":3482264,"node_id":"MDk6TWlsZXN0b25lMzQ4MjI2NA==","number":1,"title":"v1.0","description":null,"creator":{"login":"pavel-kirienko","id":3298404,"node_id":"MDQ6VXNlcjMyOTg0MDQ=","avatar_url":"https://avatars2.githubusercontent.com/u/3298404?v=4","gravatar_id":"","url":"https://api.github.com/users/pavel-kirienko","html_url":"https://github.com/pavel-kirienko","followers_url":"https://api.github.com/users/pavel-kirienko/followers","following_url":"https://api.github.com/users/pavel-kirienko/following{/other_user}","gists_url":"https://api.github.com/users/pavel-kirienko/gists{/gist_id}","starred_url":"https://api.github.com/users/pavel-kirienko/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/pavel-kirienko/subscriptions","organizations_url":"https://api.github.com/users/pavel-kirienko/orgs","repos_url":"https://api.github.com/users/pavel-kirienko/repos","events_url":"https://api.github.com/users/pavel-kirienko/events{/privacy}","received_events_url":"https://api.github.com/users/pavel-kirienko/received_events","type":"User","site_admin":false},"open_issues":3,"closed_issues":1,"state":"open","created_at":"2018-07-09T09:16:30Z","updated_at":"2018-11-16T17:23:54Z","due_on":null,"closed_at":null},"commits_url":"https://api.github.com/repos/UAVCAN/specification/pulls/32/commits","review_comments_url":"https://api.github.com/repos/UAVCAN/specification/pulls/32/comments","review_comment_url":"https://api.github.com/repos/UAVCAN/specification/pulls/comments{/number}","comments_url":"https://api.github.com/repos/UAVCAN/specification/issues/32/comments","statuses_url":"https://api.github.com/repos/UAVCAN/specification/statuses/dee725bdc328dd214980b14b8fb9c3249f9d13c0","head":{"label":"UAVCAN:subject-id","ref":"subject-id","sha":"dee725bdc328dd214980b14b8fb9c3249f9d13c0","user":{"login":"UAVCAN","id":10167381,"node_id":"MDEyOk9yZ2FuaXphdGlvbjEwMTY3Mzgx","avatar_url":"https://avatars2.githubusercontent.com/u/10167381?v=4","gravatar_id":"","url":"https://api.github.com/users/UAVCAN","html_url":"https://github.com/UAVCAN","followers_url":"https://api.github.com/users/UAVCAN/followers","following_url":"https://api.github.com/users/UAVCAN/following{/other_user}","gists_url":"https://api.github.com/users/UAVCAN/gists{/gist_id}","starred_url":"https://api.github.com/users/UAVCAN/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/UAVCAN/subscriptions","organizations_url":"https://api.github.com/users/UAVCAN/orgs","repos_url":"https://api.github.com/users/UAVCAN/repos","events_url":"https://api.github.com/users/UAVCAN/events{/privacy}","received_events_url":"https://api.github.com/users/UAVCAN/received_events","type":"Organization","site_admin":false},"repo":{"id":139164496,"node_id":"MDEwOlJlcG9zaXRvcnkxMzkxNjQ0OTY=","name":"specification","full_name":"UAVCAN/specification","private":false,"owner":{"login":"UAVCAN","id":10167381,"node_id":"MDEyOk9yZ2FuaXphdGlvbjEwMTY3Mzgx","avatar_url":"https://avatars2.githubusercontent.com/u/10167381?v=4","gravatar_id":"","url":"https://api.github.com/users/UAVCAN","html_url":"https://github.com/UAVCAN","followers_url":"https://api.github.com/users/UAVCAN/followers","following_url":"https://api.github.com/users/UAVCAN/following{/other_user}","gists_url":"https://api.github.com/users/UAVCAN/gists{/gist_id}","starred_url":"https://api.github.com/users/UAVCAN/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/UAVCAN/subscriptions","organizations_url":"https://api.github.com/users/UAVCAN/orgs","repos_url":"https://api.github.com/users/UAVCAN/repos","events_url":"https://api.github.com/users/UAVCAN/events{/privacy}","received_events_url":"https://api.github.com/users/UAVCAN/received_events","type":"Organization","site_admin":false},"html_url":"https://github.com/UAVCAN/specification","description":"The UAVCAN specification documents are maintained here. Also, this is the place for relevant discussions and propositions.","fork":false,"url":"https://api.github.com/repos/UAVCAN/specification","forks_url":"https://api.github.com/repos/UAVCAN/specification/forks","keys_url":"https://api.github.com/repos/UAVCAN/specification/keys{/key_id}","collaborators_url":"https://api.github.com/repos/UAVCAN/specification/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/UAVCAN/specification/teams","hooks_url":"https://api.github.com/repos/UAVCAN/specification/hooks","issue_events_url":"https://api.github.com/repos/UAVCAN/specification/issues/events{/number}","events_url":"https://api.github.com/repos/UAVCAN/specification/events","assignees_url":"https://api.github.com/repos/UAVCAN/specification/assignees{/user}","branches_url":"https://api.github.com/repos/UAVCAN/specification/branches{/branch}","tags_url":"https://api.github.com/repos/UAVCAN/specification/tags","blobs_url":"https://api.github.com/repos/UAVCAN/specification/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/UAVCAN/specification/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/UAVCAN/specification/git/refs{/sha}","trees_url":"https://api.github.com/repos/UAVCAN/specification/git/trees{/sha}","statuses_url":"https://api.github.com/repos/UAVCAN/specification/statuses/{sha}","languages_url":"https://api.github.com/repos/UAVCAN/specification/languages","stargazers_url":"https://api.github.com/repos/UAVCAN/specification/stargazers","contributors_url":"https://api.github.com/repos/UAVCAN/specification/contributors","subscribers_url":"https://api.github.com/repos/UAVCAN/specification/subscribers","subscription_url":"https://api.github.com/repos/UAVCAN/specification/subscription","commits_url":"https://api.github.com/repos/UAVCAN/specification/commits{/sha}","git_commits_url":"https://api.github.com/repos/UAVCAN/specification/git/commits{/sha}","comments_url":"https://api.github.com/repos/UAVCAN/specification/comments{/number}","issue_comment_url":"https://api.github.com/repos/UAVCAN/specification/issues/comments{/number}","contents_url":"https://api.github.com/repos/UAVCAN/specification/contents/{+path}","compare_url":"https://api.github.com/repos/UAVCAN/specification/compare/{base}...{head}","merges_url":"https://api.github.com/repos/UAVCAN/specification/merges","archive_url":"https://api.github.com/repos/UAVCAN/specification/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/UAVCAN/specification/downloads","issues_url":"https://api.github.com/repos/UAVCAN/specification/issues{/number}","pulls_url":"https://api.github.com/repos/UAVCAN/specification/pulls{/number}","milestones_url":"https://api.github.com/repos/UAVCAN/specification/milestones{/number}","notifications_url":"https://api.github.com/repos/UAVCAN/specification/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/UAVCAN/specification/labels{/name}","releases_url":"https://api.github.com/repos/UAVCAN/specification/releases{/id}","deployments_url":"https://api.github.com/repos/UAVCAN/specification/deployments","created_at":"2018-06-29T15:15:39Z","updated_at":"2018-12-03T09:48:57Z","pushed_at":"2018-12-03T13:59:13Z","git_url":"git://github.com/UAVCAN/specification.git","ssh_url":"git@github.com:UAVCAN/specification.git","clone_url":"https://github.com/UAVCAN/specification.git","svn_url":"https://github.com/UAVCAN/specification","homepage":null,"size":3033,"stargazers_count":3,"watchers_count":3,"language":"TeX","has_issues":true,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":2,"mirror_url":null,"archived":false,"open_issues_count":14,"license":{"key":"cc-by-4.0","name":"Creative Commons Attribution 4.0 International","spdx_id":"CC-BY-4.0","url":"https://api.github.com/licenses/cc-by-4.0","node_id":"MDc6TGljZW5zZTI1"},"forks":2,"open_issues":14,"watchers":3,"default_branch":"master"}},"base":{"label":"UAVCAN:master","ref":"master","sha":"de515cb0c38c89770f9d5c0106fffc405c0501aa","user":{"login":"UAVCAN","id":10167381,"node_id":"MDEyOk9yZ2FuaXphdGlvbjEwMTY3Mzgx","avatar_url":"https://avatars2.githubusercontent.com/u/10167381?v=4","gravatar_id":"","url":"https://api.github.com/users/UAVCAN","html_url":"https://github.com/UAVCAN","followers_url":"https://api.github.com/users/UAVCAN/followers","following_url":"https://api.github.com/users/UAVCAN/following{/other_user}","gists_url":"https://api.github.com/users/UAVCAN/gists{/gist_id}","starred_url":"https://api.github.com/users/UAVCAN/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/UAVCAN/subscriptions","organizations_url":"https://api.github.com/users/UAVCAN/orgs","repos_url":"https://api.github.com/users/UAVCAN/repos","events_url":"https://api.github.com/users/UAVCAN/events{/privacy}","received_events_url":"https://api.github.com/users/UAVCAN/received_events","type":"Organization","site_admin":false},"repo":{"id":139164496,"node_id":"MDEwOlJlcG9zaXRvcnkxMzkxNjQ0OTY=","name":"specification","full_name":"UAVCAN/specification","private":false,"owner":{"login":"UAVCAN","id":10167381,"node_id":"MDEyOk9yZ2FuaXphdGlvbjEwMTY3Mzgx","avatar_url":"https://avatars2.githubusercontent.com/u/10167381?v=4","gravatar_id":"","url":"https://api.github.com/users/UAVCAN","html_url":"https://github.com/UAVCAN","followers_url":"https://api.github.com/users/UAVCAN/followers","following_url":"https://api.github.com/users/UAVCAN/following{/other_user}","gists_url":"https://api.github.com/users/UAVCAN/gists{/gist_id}","starred_url":"https://api.github.com/users/UAVCAN/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/UAVCAN/subscriptions","organizations_url":"https://api.github.com/users/UAVCAN/orgs","repos_url":"https://api.github.com/users/UAVCAN/repos","events_url":"https://api.github.com/users/UAVCAN/events{/privacy}","received_events_url":"https://api.github.com/users/UAVCAN/received_events","type":"Organization","site_admin":false},"html_url":"https://github.com/UAVCAN/specification","description":"The UAVCAN specification documents are maintained here. Also, this is the place for relevant discussions and propositions.","fork":false,"url":"https://api.github.com/repos/UAVCAN/specification","forks_url":"https://api.github.com/repos/UAVCAN/specification/forks","keys_url":"https://api.github.com/repos/UAVCAN/specification/keys{/key_id}","collaborators_url":"https://api.github.com/repos/UAVCAN/specification/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/UAVCAN/specification/teams","hooks_url":"https://api.github.com/repos/UAVCAN/specification/hooks","issue_events_url":"https://api.github.com/repos/UAVCAN/specification/issues/events{/number}","events_url":"https://api.github.com/repos/UAVCAN/specification/events","assignees_url":"https://api.github.com/repos/UAVCAN/specification/assignees{/user}","branches_url":"https://api.github.com/repos/UAVCAN/specification/branches{/branch}","tags_url":"https://api.github.com/repos/UAVCAN/specification/tags","blobs_url":"https://api.github.com/repos/UAVCAN/specification/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/UAVCAN/specification/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/UAVCAN/specification/git/refs{/sha}","trees_url":"https://api.github.com/repos/UAVCAN/specification/git/trees{/sha}","statuses_url":"https://api.github.com/repos/UAVCAN/specification/statuses/{sha}","languages_url":"https://api.github.com/repos/UAVCAN/specification/languages","stargazers_url":"https://api.github.com/repos/UAVCAN/specification/stargazers","contributors_url":"https://api.github.com/repos/UAVCAN/specification/contributors","subscribers_url":"https://api.github.com/repos/UAVCAN/specification/subscribers","subscription_url":"https://api.github.com/repos/UAVCAN/specification/subscription","commits_url":"https://api.github.com/repos/UAVCAN/specification/commits{/sha}","git_commits_url":"https://api.github.com/repos/UAVCAN/specification/git/commits{/sha}","comments_url":"https://api.github.com/repos/UAVCAN/specification/comments{/number}","issue_comment_url":"https://api.github.com/repos/UAVCAN/specification/issues/comments{/number}","contents_url":"https://api.github.com/repos/UAVCAN/specification/contents/{+path}","compare_url":"https://api.github.com/repos/UAVCAN/specification/compare/{base}...{head}","merges_url":"https://api.github.com/repos/UAVCAN/specification/merges","archive_url":"https://api.github.com/repos/UAVCAN/specification/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/UAVCAN/specification/downloads","issues_url":"https://api.github.com/repos/UAVCAN/specification/issues{/number}","pulls_url":"https://api.github.com/repos/UAVCAN/specification/pulls{/number}","milestones_url":"https://api.github.com/repos/UAVCAN/specification/milestones{/number}","notifications_url":"https://api.github.com/repos/UAVCAN/specification/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/UAVCAN/specification/labels{/name}","releases_url":"https://api.github.com/repos/UAVCAN/specification/releases{/id}","deployments_url":"https://api.github.com/repos/UAVCAN/specification/deployments","created_at":"2018-06-29T15:15:39Z","updated_at":"2018-12-03T09:48:57Z","pushed_at":"2018-12-03T13:59:13Z","git_url":"git://github.com/UAVCAN/specification.git","ssh_url":"git@github.com:UAVCAN/specification.git","clone_url":"https://github.com/UAVCAN/specification.git","svn_url":"https://github.com/UAVCAN/specification","homepage":null,"size":3033,"stargazers_count":3,"watchers_count":3,"language":"TeX","has_issues":true,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":2,"mirror_url":null,"archived":false,"open_issues_count":14,"license":{"key":"cc-by-4.0","name":"Creative Commons Attribution 4.0 International","spdx_id":"CC-BY-4.0","url":"https://api.github.com/licenses/cc-by-4.0","node_id":"MDc6TGljZW5zZTI1"},"forks":2,"open_issues":14,"watchers":3,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/UAVCAN/specification/pulls/32"},"html":{"href":"https://github.com/UAVCAN/specification/pull/32"},"issue":{"href":"https://api.github.com/repos/UAVCAN/specification/issues/32"},"comments":{"href":"https://api.github.com/repos/UAVCAN/specification/issues/32/comments"},"review_comments":{"href":"https://api.github.com/repos/UAVCAN/specification/pulls/32/comments"},"review_comment":{"href":"https://api.github.com/repos/UAVCAN/specification/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/UAVCAN/specification/pulls/32/commits"},"statuses":{"href":"https://api.github.com/repos/UAVCAN/specification/statuses/dee725bdc328dd214980b14b8fb9c3249f9d13c0"}},"author_association":"MEMBER"}}
{"actor":{"display_login":"thirtytwobits"}}