Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
17 changes: 12 additions & 5 deletions .github/CODEOWNERS
Original file line number Diff line number Diff line change
Expand Up @@ -9,17 +9,24 @@
# catch-all.

#
# WHY THESE PATHS NAME TWO OWNERS AND NOT ONE.
# WHY THESE PATHS NAME TWO ACCOUNTS AND NOT ONE.
#
# They named only @0j0bit until 2026-09-12. That deadlocks: GitHub does not let
# anyone approve their own pull request, and the branch ruleset grants no
# bypass to administrators, so a pull request touching one of these paths and
# authored by its sole code owner could never be merged by anyone.
#
# Both named accounts have write access, which a code owner must have to count.
# These lines currently resolve to the same two people as the catch-all, so
# their present effect is documentary: they record which paths are authorities.
# If the catch-all ever widens, they narrow again on their own.
# @0j0bit and @sed-boi are two GitHub accounts controlled by the SAME project
# owner. Either account may satisfy the code-owner review requirement for a
# change it did not author -- in practice, changes proposed by the
# mcl-release-governor App and reviewed as @0j0bit. This is account redundancy,
# NOT independent two-person review, and nothing here claims separation of
# duties.
#
# Both accounts have write access, which a code owner must have to count. The
# path lines below name the same accounts as the catch-all, so their present
# effect is documentary: they record which paths are authorities. If the
# catch-all ever widens, they narrow again on their own.

* @0j0bit @sed-boi

Expand Down
48 changes: 45 additions & 3 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,48 @@
# MCL Link

`mcl-link` defines contact establishment, framing, sessions, addressing, quality-of-service, negotiation, and adaptation for the Machine Contact Layer.
<p align="center">
<img src="https://raw.githubusercontent.com/machine-contact-layer/.github/main/profile/banner.png" alt="OJOBIT" width="100%">
</p>

<h1 align="center">MCL Link</h1>

<p align="center"><strong>Keeping one contact alive — through framing, sessions, and a change of transport.</strong></p>

<p align="center">
<a href="https://github.com/machine-contact-layer/mcl-link/actions/workflows/ci.yml"><img alt="CI" src="https://github.com/machine-contact-layer/mcl-link/actions/workflows/ci.yml/badge.svg"></a>
<a href="https://github.com/machine-contact-layer/mcl-link/blob/main/LICENSE"><img alt="License Apache-2.0" src="https://img.shields.io/badge/license-Apache--2.0-blue"></a>
<img alt="Link major 1" src="https://img.shields.io/badge/link%20major-1%20Stable-brightgreen">
<img alt="C99 freestanding" src="https://img.shields.io/badge/C99-freestanding-informational">
</p>

<p align="center">
<a href="https://github.com/machine-contact-layer/mcl-sdk"><b>Use the SDK instead</b></a> ·
<a href="https://github.com/machine-contact-layer/mcl-core"><b>Specifications</b></a> ·
<a href="https://github.com/machine-contact-layer/mcl-wire"><b>mcl-wire</b></a>
</p>

---

> ### Most people should start with the SDK, not here
>
> This repository is a **specification**. If you are building a product, start
> with [**mcl-sdk**](https://github.com/machine-contact-layer/mcl-sdk): its quickstart runs two machines making
> contact, and the release ships a self-contained developer SDK — one CMake
> project, no sibling checkout. Come back here when you need to know exactly
> what a byte means, or when you are writing an independent implementation.

## Why this exists

A contact that dies when the radio changes is not a contact. MCL Link is what
survives the change: framing, session identity, negotiation, refusal, and
migration from one transport to another without starting over.

This is the layer every binding maps onto, which is why a `HAZARD` means the
same thing over a loudspeaker and over UDP. In one physical campaign a single logical
contact was preserved across **104 physical-medium changes**, including 100
alternating BLE/IP migrations.

**Link major 1 is Stable.** That migration campaign carried major-0 traffic;
Wire 1 inside Link 1 is evidenced separately, decoded over air on an embedded
target.

It is transport-profile neutral. MCL-AP, MCL-IP, MCL-BLE, MCL-UWB, and future bindings implement the same link/session contract through different physical transports.

Expand Down
Loading