From 6bae0a92f90b7b75c2c04902a38c4afb6ee30b0f Mon Sep 17 00:00:00 2001 From: 0j0bit Date: Sun, 13 Sep 2026 00:02:38 +0530 Subject: [PATCH 1/3] Make the README a front door instead of a specification cover page Anyone arriving here got "Scope" and "Non-goals" and no way to tell whether this repository was the one they needed, what MCL would look like in their own code, or where to go if it was not. That is the right shape for a reader who already knows what MCL is, and the wrong shape for everyone else. The specification content is unchanged and still here, underneath. What is new sits above it: - the OJOBIT banner, and badges that carry live state -- CI status is the real workflow badge, so it goes red on its own rather than being a decoration - one sentence saying what this repository is for, in plain language - a routing block. Most people should not read a specification to use MCL, they should use mcl-sdk, and the README now says so at the top instead of letting them find out later - a short "why this exists" that gives the reason the layer is shaped this way, rather than restating the scope list immediately below it Maturity is stated on the badge rather than buried: which profiles are Stable, which are Candidate, and -- for mcl-uwb -- that the binding is specified but has never been run on hardware, with a pointer to the bindings that have. A reader deciding what to build on should not have to dig for that. No specification text, normative wording, conformance claim or evidence reference was altered, and no executable source is touched. Co-Authored-By: Claude Opus 5 --- .github/banner.png | Bin 0 -> 8031 bytes README.md | 44 ++++++++++++++++++++++++++++++++++++++++++-- 2 files changed, 42 insertions(+), 2 deletions(-) create mode 100644 .github/banner.png diff --git a/.github/banner.png b/.github/banner.png new file mode 100644 index 0000000000000000000000000000000000000000..0804c293b2f593ba4552b9007983e5dc3eae864e GIT binary patch literal 8031 zcmeHM4OElY8U8?&Vi8nu#VtVHR-DCCw4lguRB+(o&r{l}wFMbUP$c|>3KB^e9Av-- z9Wefq5CLpzdnab zj;p_26%PO|BS(V|y`NEAk2X1VE7RXX&**Y1)s^XNl(siD`yKUrx%^d83_)=qOgVHiw6*So@xL1 zWMICmyEbv5I00|V48|PyQpcyd)paxsyXJci@U}4^Ct?x5B~jix5$=_Fq!qaV)zI$# z4slnqnn4*eM#y5 zEC0fCJeZ|{EM^jII1FMQ$4c5jT zWhFCjBkRBc`f0rMscZ5Y`wVxUQB}Iu8O5a76eK1wxoQfM%_hw;Pty^`42TYfH8Uht zP$*F%%0V2NKp^Z1EEz?=F%{0^qN!=eZK+hM?9yh`R6PhQ3_l#!fL3Ik=iaBT3@DNL z;56P#-RR?x|Kf+r6jMHAI{JTQN}GaBNB?S;V4kMk#auHWIx_!ohTJC+M$wseKBPz= zm$DrvDV&oxKiuJiuZ?Lvx>gc>RM=W2!Wg&}zec@RrFryfi+ZGaYTIO+3w; zzilU&O!(iqqS`ps?ked#AF)B**b60wWuq~rS`l$sYoC&8G!M&mMr&c#7agGvnw3dx#`y^L18h!ZAC>j$;4ob&jPm!(D+!jO%b({MYVe3=T#U0EC0b1wGsCClToxD)L zxux|7#G-B}Q67SEgSq~qhmvtqW@O6u&E8o@>s&J+IvieAmEe_m=K{~ORBi+^^z=dk zZJfMaTUa6rt&?FdJ^S#1YPlbpy^S0xujdluwXUMDdu{#R|0DmrvRTIfz(thhKjc5u zSM4F0>M6O*f>oP=iUMt`XW7kB%H_rBM!ZIb`r>^`Oy?u~++WGVTXQIaslg1_NW~Oq z>8{wpP(hfm8KdFJu{h<-08K+LwAZ}-cAzy^v_ECM3!LM?7I0XsxWvS%MN}0wa7cP- zcR*#NMiV6fY5Q_EL@E2L5{m_tSQ<_$CNI?W;r&?Mjw}tsr(F&&u`1B3aeMD8eSu@b zg6&>Sp|xgZzom?Kwk!1LA}bgK?{P4*0U5&fgr>`okV+=Z$R6~mg;r*gu94|JwOwLt z_MgD`Pw)wNMM{dWiNlM9oGC1Z6n=pjI{b?o0bg|^wga+lK{nFVG{rs}Ls`*&8B~nZ zmYEVEeoS<+43e-F&aq#UciGy^vRKmJd(ddu;?JXecCyKx{wU6tw4$b5s8Z}jgZjrh zv5MX6R5RmgzTO-KJ(|hb8qux(GiEO-zpoV!rX-3G8F#kTDCGxK6NCo!zY232$u2=t7Bxl*^>@ zw=L-ZMc{i``0+OV6^8#rGa2{j{9V-?rfM zq>SJm%20AdY#;dTlj|OV70vY(bF2)NY%l@^juR_{yZ~?ZxNr$O*$i)29hCerZUY;X z@EL^fL`GWJXDOG?GEm~N&ORIsFC~+wl#a)%FBD&{#tVdE$t1lnM5AoRC4_mc7YqIF zAqh}dloApP6|vCO9?TvXD%LZyzs&Pg!yG=0Q`$TIhDMpuVkJ%KTRj;}g$G9?Ewl23 z`?v%KA13~iOw8($1~3gwjtK)hFMXS|pygal6jX^x6JZbRWMgoT+G}Daq0ZVaYiJ3P zGl$t>sBrjqJATpCd+pP68~+mhYznD%VHIH(Sxw>sGOjI8b73Q2Lq>*A{wu)$C#rmz zXgF{8Inx<~y8BVVvkc#vEdMKKT8FJrQ{^2EaPUrqf1LjB-8($z9y~}9Ot$^jJv_~^ zg7%+X8AVgC!50zp3biNw2djZzJ?e~11`b}fHec1jk#4?})E{@N)iu*`{hz(eonUG# Yog$%zFK-sy(=K`RNMvx!;nR8l1YmO`6#xJL literal 0 HcmV?d00001 diff --git a/README.md b/README.md index b7ad5c9..dcf1f5f 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,46 @@ -# MCL Link +

+ OJOBIT +

-`mcl-link` defines contact establishment, framing, sessions, addressing, quality-of-service, negotiation, and adaptation for the Machine Contact Layer. +

MCL Link

+ +

Keeping one contact alive — through framing, sessions, and a change of transport.

+ +

+ CI + License Apache-2.0 + Link major 1 + C99 freestanding +

+ +

+ Use the SDK instead · + Specifications · + mcl-wire +

+ +--- + +> ### Most people should start with the SDK, not here +> +> This repository is a **specification**. If you are building a product, you +> want [**mcl-sdk**](https://github.com/machine-contact-layer/mcl-sdk) — one CMake project, no sibling checkout, and a +> working example you can run in about a minute. 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 campaign a single logical +contact was preserved across **104 physical-medium changes**, including 100 +alternating BLE/IP migrations. + +**Link major 1 is Stable.** 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. From d5239fe84c46e1a73b47a7124904b5926f79e1f7 Mon Sep 17 00:00:00 2001 From: 0j0bit Date: Sun, 13 Sep 2026 08:17:16 +0530 Subject: [PATCH 2/3] Correct the adoption front door against verified facts Every claim here was checked before it was written, and three were wrong. - mcl-sdk said to clone it alone and build. A fresh anonymous clone fails to configure, because the repository builds against its sibling specifications. The README now gives both real paths, each verified from anonymous downloads: the release developer SDK archive, one CMake project with no sibling checkout, and the eight repositories cloned side by side. Both configure, build and run the Base 1 example to CONTACT_ESTABLISHED on both sides. - The mcl-sdk snippet passed a string where mcl_machine_config_deployment takes a numeric source reference and a role, and admitted on PEER_DETECTED where the API raises POLICY_REQUIRED. The replacement was compiled with -std=c99 -Wall -Werror against the real headers, linked and run: init and start return MCL_MACHINE_OK with only clock_ms, transport_send and user set, which is what the prose now says Base 1 needs. - mcl-uwb carried a status badge the ICS does not use. The ICS says experimental, so the badge does. Also: the SDK-first callouts no longer call the mcl-sdk repository one CMake project with no sibling checkout, which describes the release developer SDK; mcl-link no longer sets the 104-migration campaign, which carried major-0 traffic, directly beside the Link major 1 Stable claim; the organization profile no longer calls the specifications frozen before the Candidate is sealed. CODEOWNERS prose: @0j0bit and @sed-boi are two accounts controlled by the same project owner. That is account redundancy, not independent two-person review. Owner patterns are unchanged. No specification text, conformance claim, evidence reference or executable source changed. Co-Authored-By: Claude Opus 5 --- .github/CODEOWNERS | 17 ++++++++++++----- README.md | 16 +++++++++------- 2 files changed, 21 insertions(+), 12 deletions(-) diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index edca3c7..a2dab43 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -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 diff --git a/README.md b/README.md index dcf1f5f..4deb34e 100644 --- a/README.md +++ b/README.md @@ -23,11 +23,11 @@ > ### Most people should start with the SDK, not here > -> This repository is a **specification**. If you are building a product, you -> want [**mcl-sdk**](https://github.com/machine-contact-layer/mcl-sdk) — one CMake project, no sibling checkout, and a -> working example you can run in about a minute. Come back here when you need -> to know exactly what a byte means, or when you are writing an independent -> implementation. +> 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 @@ -36,11 +36,13 @@ 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 campaign a single logical +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.** +**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. From 27d582755dfb9d8a65b9996352b91a3fc72763cf Mon Sep 17 00:00:00 2001 From: 0j0bit Date: Sun, 13 Sep 2026 08:26:37 +0530 Subject: [PATCH 3/3] Reference the organization banner instead of copying it into every repository check-provenance.sh refuses a binary outside the accounted evidence and experiment locations, and it was right to: eight copies of a brand image in eight release repositories is eight unaccounted binaries, and eight places for one asset to drift. The banner now lives once, in the .github organization-infrastructure repository, and each README references it there. No gate was loosened to make this pass. Co-Authored-By: Claude Opus 5 --- .github/banner.png | Bin 8031 -> 0 bytes README.md | 2 +- 2 files changed, 1 insertion(+), 1 deletion(-) delete mode 100644 .github/banner.png diff --git a/.github/banner.png b/.github/banner.png deleted file mode 100644 index 0804c293b2f593ba4552b9007983e5dc3eae864e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8031 zcmeHM4OElY8U8?&Vi8nu#VtVHR-DCCw4lguRB+(o&r{l}wFMbUP$c|>3KB^e9Av-- z9Wefq5CLpzdnab zj;p_26%PO|BS(V|y`NEAk2X1VE7RXX&**Y1)s^XNl(siD`yKUrx%^d83_)=qOgVHiw6*So@xL1 zWMICmyEbv5I00|V48|PyQpcyd)paxsyXJci@U}4^Ct?x5B~jix5$=_Fq!qaV)zI$# z4slnqnn4*eM#y5 zEC0fCJeZ|{EM^jII1FMQ$4c5jT zWhFCjBkRBc`f0rMscZ5Y`wVxUQB}Iu8O5a76eK1wxoQfM%_hw;Pty^`42TYfH8Uht zP$*F%%0V2NKp^Z1EEz?=F%{0^qN!=eZK+hM?9yh`R6PhQ3_l#!fL3Ik=iaBT3@DNL z;56P#-RR?x|Kf+r6jMHAI{JTQN}GaBNB?S;V4kMk#auHWIx_!ohTJC+M$wseKBPz= zm$DrvDV&oxKiuJiuZ?Lvx>gc>RM=W2!Wg&}zec@RrFryfi+ZGaYTIO+3w; zzilU&O!(iqqS`ps?ked#AF)B**b60wWuq~rS`l$sYoC&8G!M&mMr&c#7agGvnw3dx#`y^L18h!ZAC>j$;4ob&jPm!(D+!jO%b({MYVe3=T#U0EC0b1wGsCClToxD)L zxux|7#G-B}Q67SEgSq~qhmvtqW@O6u&E8o@>s&J+IvieAmEe_m=K{~ORBi+^^z=dk zZJfMaTUa6rt&?FdJ^S#1YPlbpy^S0xujdluwXUMDdu{#R|0DmrvRTIfz(thhKjc5u zSM4F0>M6O*f>oP=iUMt`XW7kB%H_rBM!ZIb`r>^`Oy?u~++WGVTXQIaslg1_NW~Oq z>8{wpP(hfm8KdFJu{h<-08K+LwAZ}-cAzy^v_ECM3!LM?7I0XsxWvS%MN}0wa7cP- zcR*#NMiV6fY5Q_EL@E2L5{m_tSQ<_$CNI?W;r&?Mjw}tsr(F&&u`1B3aeMD8eSu@b zg6&>Sp|xgZzom?Kwk!1LA}bgK?{P4*0U5&fgr>`okV+=Z$R6~mg;r*gu94|JwOwLt z_MgD`Pw)wNMM{dWiNlM9oGC1Z6n=pjI{b?o0bg|^wga+lK{nFVG{rs}Ls`*&8B~nZ zmYEVEeoS<+43e-F&aq#UciGy^vRKmJd(ddu;?JXecCyKx{wU6tw4$b5s8Z}jgZjrh zv5MX6R5RmgzTO-KJ(|hb8qux(GiEO-zpoV!rX-3G8F#kTDCGxK6NCo!zY232$u2=t7Bxl*^>@ zw=L-ZMc{i``0+OV6^8#rGa2{j{9V-?rfM zq>SJm%20AdY#;dTlj|OV70vY(bF2)NY%l@^juR_{yZ~?ZxNr$O*$i)29hCerZUY;X z@EL^fL`GWJXDOG?GEm~N&ORIsFC~+wl#a)%FBD&{#tVdE$t1lnM5AoRC4_mc7YqIF zAqh}dloApP6|vCO9?TvXD%LZyzs&Pg!yG=0Q`$TIhDMpuVkJ%KTRj;}g$G9?Ewl23 z`?v%KA13~iOw8($1~3gwjtK)hFMXS|pygal6jX^x6JZbRWMgoT+G}Daq0ZVaYiJ3P zGl$t>sBrjqJATpCd+pP68~+mhYznD%VHIH(Sxw>sGOjI8b73Q2Lq>*A{wu)$C#rmz zXgF{8Inx<~y8BVVvkc#vEdMKKT8FJrQ{^2EaPUrqf1LjB-8($z9y~}9Ot$^jJv_~^ zg7%+X8AVgC!50zp3biNw2djZzJ?e~11`b}fHec1jk#4?})E{@N)iu*`{hz(eonUG# Yog$%zFK-sy(=K`RNMvx!;nR8l1YmO`6#xJL diff --git a/README.md b/README.md index 4deb34e..abf0f38 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,5 @@

- OJOBIT + OJOBIT

MCL Link