[{"data":1,"prerenderedAt":1710},["ShallowReactive",2],{"sidebar-pages":3,"doc-/abi":20},[4,8,12,16],{"_path":5,"title":6,"order":7},"/abi","ABI & boundary",2,{"_path":9,"title":10,"order":11},"/architecture","Architecture",1,{"_path":13,"title":14,"order":15},"/l3-modules","L3 — Provider SDK",3,{"_path":17,"title":18,"order":19},"/l4-apps","L4 — App SDK",4,{"_path":5,"_dir":21,"_draft":22,"_partial":22,"_locale":21,"title":6,"description":21,"order":7,"body":23,"_type":1703,"_id":1704,"_source":1705,"_file":1706,"_stem":1707,"_extension":1708,"sitemap":1709},"",false,{"type":24,"children":25,"toc":1693},"root",[26,42,107,114,154,159,236,242,566,592,605,624,838,844,1080,1086,1254,1259,1286,1291,1367,1379,1454,1460,1687],{"type":27,"tag":28,"props":29,"children":31},"element","h1",{"id":30},"legion-abi-the-public-dynamic-surface-of-liblegionso",[32,35],{"type":33,"value":34},"text","Legion ABI — the public dynamic surface of ",{"type":27,"tag":36,"props":37,"children":39},"code",{"className":38},[],[40],{"type":33,"value":41},"liblegion.so",{"type":27,"tag":43,"props":44,"children":45},"blockquote",{},[46],{"type":27,"tag":47,"props":48,"children":49},"p",{},[50,56,58,63,65,70,72,78,80,85,87,94,96,105],{"type":27,"tag":51,"props":52,"children":53},"strong",{},[54],{"type":33,"value":55},"Status:",{"type":33,"value":57}," the export ",{"type":27,"tag":51,"props":59,"children":60},{},[61],{"type":33,"value":62},"boundary",{"type":33,"value":64}," is ",{"type":27,"tag":51,"props":66,"children":67},{},[68],{"type":33,"value":69},"locked + CI-enforced",{"type":33,"value":71}," (Foundation 09,\n2026-06-18) by 3 build mechanisms + a gate (",{"type":27,"tag":36,"props":73,"children":75},{"className":74},[],[76],{"type":33,"value":77},"check_internal_symbols_hidden.sh",{"type":33,"value":79},").\nThe ",{"type":27,"tag":51,"props":81,"children":82},{},[83],{"type":33,"value":84},"symbol set itself is a pre-release DRAFT",{"type":33,"value":86}," — the L3/L4 surfaces are under\nreview and will change before any release (see\n",{"type":27,"tag":88,"props":89,"children":91},"a",{"href":90},"#stability-draft-status",[92],{"type":33,"value":93},"Stability & draft status",{"type":33,"value":95}," and\n",{"type":27,"tag":88,"props":97,"children":98},{"href":9},[99],{"type":27,"tag":36,"props":100,"children":102},{"className":101},[],[103],{"type":33,"value":104},"architecture.md",{"type":33,"value":106},").",{"type":27,"tag":108,"props":109,"children":111},"h2",{"id":110},"tldr",[112],{"type":33,"value":113},"TL;DR",{"type":27,"tag":47,"props":115,"children":116},{},[117,122,124,137,139,144,146,152],{"type":27,"tag":36,"props":118,"children":120},{"className":119},[],[121],{"type":33,"value":41},{"type":33,"value":123}," exports ",{"type":27,"tag":51,"props":125,"children":126},{},[127,129,135],{"type":33,"value":128},"exactly 131 ",{"type":27,"tag":36,"props":130,"children":132},{"className":131},[],[133],{"type":33,"value":134},"legion_*",{"type":33,"value":136}," symbols and nothing else",{"type":33,"value":138}," — no\nbundled libsodium, no internal Legion symbols. That set is the ",{"type":27,"tag":51,"props":140,"children":141},{},[142],{"type":33,"value":143},"L4 dynamic\nABI",{"type":33,"value":145},": the stable native-C surface any consumer links against — native desktop\napplications, embedded / microcontroller targets, and language bindings alike.\nIt is the ",{"type":27,"tag":147,"props":148,"children":149},"em",{},[150],{"type":33,"value":151},"sovereignty boundary",{"type":33,"value":153}," — everything an app or binding is allowed to\ncall, and nothing more. (The Android NDK app was the first proof-of-concept\nconsumer that exercised L1–L4; Android is not a constraint.)",{"type":27,"tag":47,"props":155,"children":156},{},[157],{"type":33,"value":158},"To see it:",{"type":27,"tag":160,"props":161,"children":165},"pre",{"className":162,"code":163,"language":164,"meta":21,"style":21},"language-sh shiki shiki-themes github-dark github-dark","nm -D --defined-only build/liblegion.so | awk '{print $3}' | grep '^legion_' | sort\n","sh",[166],{"type":27,"tag":36,"props":167,"children":168},{"__ignoreMap":21},[169],{"type":27,"tag":170,"props":171,"children":173},"span",{"class":172,"line":11},"line",[174,180,186,191,197,203,208,213,217,222,227,231],{"type":27,"tag":170,"props":175,"children":177},{"style":176},"--shiki-default:#B392F0;--shiki-dark:#B392F0",[178],{"type":33,"value":179},"nm",{"type":27,"tag":170,"props":181,"children":183},{"style":182},"--shiki-default:#79B8FF;--shiki-dark:#79B8FF",[184],{"type":33,"value":185}," -D",{"type":27,"tag":170,"props":187,"children":188},{"style":182},[189],{"type":33,"value":190}," --defined-only",{"type":27,"tag":170,"props":192,"children":194},{"style":193},"--shiki-default:#9ECBFF;--shiki-dark:#9ECBFF",[195],{"type":33,"value":196}," build/liblegion.so",{"type":27,"tag":170,"props":198,"children":200},{"style":199},"--shiki-default:#F97583;--shiki-dark:#F97583",[201],{"type":33,"value":202}," |",{"type":27,"tag":170,"props":204,"children":205},{"style":176},[206],{"type":33,"value":207}," awk",{"type":27,"tag":170,"props":209,"children":210},{"style":193},[211],{"type":33,"value":212}," '{print $3}'",{"type":27,"tag":170,"props":214,"children":215},{"style":199},[216],{"type":33,"value":202},{"type":27,"tag":170,"props":218,"children":219},{"style":176},[220],{"type":33,"value":221}," grep",{"type":27,"tag":170,"props":223,"children":224},{"style":193},[225],{"type":33,"value":226}," '^legion_'",{"type":27,"tag":170,"props":228,"children":229},{"style":199},[230],{"type":33,"value":202},{"type":27,"tag":170,"props":232,"children":233},{"style":176},[234],{"type":33,"value":235}," sort\n",{"type":27,"tag":108,"props":237,"children":239},{"id":238},"whats-in-the-abi-131-symbols",[240],{"type":33,"value":241},"What's in the ABI (131 symbols)",{"type":27,"tag":243,"props":244,"children":245},"table",{},[246,281],{"type":27,"tag":247,"props":248,"children":249},"thead",{},[250],{"type":27,"tag":251,"props":252,"children":253},"tr",{},[254,260,265,271,276],{"type":27,"tag":255,"props":256,"children":257},"th",{},[258],{"type":33,"value":259},"Category",{"type":27,"tag":255,"props":261,"children":262},{},[263],{"type":33,"value":264},"Symbol prefix",{"type":27,"tag":255,"props":266,"children":268},{"align":267},"right",[269],{"type":33,"value":270},"Count",{"type":27,"tag":255,"props":272,"children":273},{},[274],{"type":33,"value":275},"Header",{"type":27,"tag":255,"props":277,"children":278},{},[279],{"type":33,"value":280},"Role",{"type":27,"tag":282,"props":283,"children":284},"tbody",{},[285,325,423,476,543],{"type":27,"tag":251,"props":286,"children":287},{},[288,297,306,311,320],{"type":27,"tag":289,"props":290,"children":291},"td",{},[292],{"type":27,"tag":51,"props":293,"children":294},{},[295],{"type":33,"value":296},"FFI subsystem bridges",{"type":27,"tag":289,"props":298,"children":299},{},[300],{"type":27,"tag":36,"props":301,"children":303},{"className":302},[],[304],{"type":33,"value":305},"legion_ffi_*",{"type":27,"tag":289,"props":307,"children":308},{"align":267},[309],{"type":33,"value":310},"101",{"type":27,"tag":289,"props":312,"children":313},{},[314],{"type":27,"tag":36,"props":315,"children":317},{"className":316},[],[318],{"type":33,"value":319},"legion_ffi_{audio,bridge,connection,display,focus,identity,js,node,objectstore}.h",{"type":27,"tag":289,"props":321,"children":322},{},[323],{"type":33,"value":324},"Language-binding entrypoints: opaque handles, explicit memory ownership, no internal structs. The bulk of the surface.",{"type":27,"tag":251,"props":326,"children":327},{},[328,336,345,350,359],{"type":27,"tag":289,"props":329,"children":330},{},[331],{"type":27,"tag":51,"props":332,"children":333},{},[334],{"type":33,"value":335},"L4 node lifecycle",{"type":27,"tag":289,"props":337,"children":338},{},[339],{"type":27,"tag":36,"props":340,"children":342},{"className":341},[],[343],{"type":33,"value":344},"legion_node_*",{"type":27,"tag":289,"props":346,"children":347},{"align":267},[348],{"type":33,"value":349},"14",{"type":27,"tag":289,"props":351,"children":352},{},[353],{"type":27,"tag":36,"props":354,"children":356},{"className":355},[],[357],{"type":33,"value":358},"l4_node.h",{"type":27,"tag":289,"props":360,"children":361},{},[362,364,370,372,378,379,385,386,392,393,399,401,407,408,414,415,421],{"type":33,"value":363},"Typed C wrappers over node operations: ",{"type":27,"tag":36,"props":365,"children":367},{"className":366},[],[368],{"type":33,"value":369},"create_from_file",{"type":33,"value":371},", ",{"type":27,"tag":36,"props":373,"children":375},{"className":374},[],[376],{"type":33,"value":377},"start",{"type":33,"value":371},{"type":27,"tag":36,"props":380,"children":382},{"className":381},[],[383],{"type":33,"value":384},"stop",{"type":33,"value":371},{"type":27,"tag":36,"props":387,"children":389},{"className":388},[],[390],{"type":33,"value":391},"destroy",{"type":33,"value":371},{"type":27,"tag":36,"props":394,"children":396},{"className":395},[],[397],{"type":33,"value":398},"reload",{"type":33,"value":400},", and getters (",{"type":27,"tag":36,"props":402,"children":404},{"className":403},[],[405],{"type":33,"value":406},"get_node_id",{"type":33,"value":371},{"type":27,"tag":36,"props":409,"children":411},{"className":410},[],[412],{"type":33,"value":413},"get_peers",{"type":33,"value":371},{"type":27,"tag":36,"props":416,"children":418},{"className":417},[],[419],{"type":33,"value":420},"format_status",{"type":33,"value":422},", …).",{"type":27,"tag":251,"props":424,"children":425},{},[426,434,457,462,471],{"type":27,"tag":289,"props":427,"children":428},{},[429],{"type":27,"tag":51,"props":430,"children":431},{},[432],{"type":33,"value":433},"FFI helpers",{"type":27,"tag":289,"props":435,"children":436},{},[437,443,444,450,451],{"type":27,"tag":36,"props":438,"children":440},{"className":439},[],[441],{"type":33,"value":442},"legion_params_*",{"type":33,"value":371},{"type":27,"tag":36,"props":445,"children":447},{"className":446},[],[448],{"type":33,"value":449},"legion_result_*",{"type":33,"value":371},{"type":27,"tag":36,"props":452,"children":454},{"className":453},[],[455],{"type":33,"value":456},"legion_string_*",{"type":27,"tag":289,"props":458,"children":459},{"align":267},[460],{"type":33,"value":461},"7",{"type":27,"tag":289,"props":463,"children":464},{},[465],{"type":27,"tag":36,"props":466,"children":468},{"className":467},[],[469],{"type":33,"value":470},"legion_ffi.h",{"type":27,"tag":289,"props":472,"children":473},{},[474],{"type":33,"value":475},"Glue for languages without native map types: the params builder, result container free, string length.",{"type":27,"tag":251,"props":477,"children":478},{},[479,487,524,529,538],{"type":27,"tag":289,"props":480,"children":481},{},[482],{"type":27,"tag":51,"props":483,"children":484},{},[485],{"type":33,"value":486},"Library base",{"type":27,"tag":289,"props":488,"children":489},{},[490,496,497,503,504,510,511,517,518],{"type":27,"tag":36,"props":491,"children":493},{"className":492},[],[494],{"type":33,"value":495},"legion_version*",{"type":33,"value":371},{"type":27,"tag":36,"props":498,"children":500},{"className":499},[],[501],{"type":33,"value":502},"legion_build_id",{"type":33,"value":371},{"type":27,"tag":36,"props":505,"children":507},{"className":506},[],[508],{"type":33,"value":509},"legion_free",{"type":33,"value":371},{"type":27,"tag":36,"props":512,"children":514},{"className":513},[],[515],{"type":33,"value":516},"legion_log_set_*",{"type":33,"value":371},{"type":27,"tag":36,"props":519,"children":521},{"className":520},[],[522],{"type":33,"value":523},"legion_config_find",{"type":27,"tag":289,"props":525,"children":526},{"align":267},[527],{"type":33,"value":528},"9",{"type":27,"tag":289,"props":530,"children":531},{},[532],{"type":27,"tag":36,"props":533,"children":535},{"className":534},[],[536],{"type":33,"value":537},"legion.h",{"type":27,"tag":289,"props":539,"children":540},{},[541],{"type":33,"value":542},"Version/build introspection, library-allocated-memory free, logging callback + level, config-file lookup.",{"type":27,"tag":251,"props":544,"children":545},{},[546,549,552,560,563],{"type":27,"tag":289,"props":547,"children":548},{},[],{"type":27,"tag":289,"props":550,"children":551},{},[],{"type":27,"tag":289,"props":553,"children":554},{"align":267},[555],{"type":27,"tag":51,"props":556,"children":557},{},[558],{"type":33,"value":559},"131",{"type":27,"tag":289,"props":561,"children":562},{},[],{"type":27,"tag":289,"props":564,"children":565},{},[],{"type":27,"tag":47,"props":567,"children":568},{},[569,571,576,578,590],{"type":33,"value":570},"The exact count is informational (it grows as the L4 surface grows). The\n",{"type":27,"tag":147,"props":572,"children":573},{},[574],{"type":33,"value":575},"invariant",{"type":33,"value":577}," the CI gate enforces is ",{"type":27,"tag":51,"props":579,"children":580},{},[581,583,588],{"type":33,"value":582},"\"exports only ",{"type":27,"tag":36,"props":584,"children":586},{"className":585},[],[587],{"type":33,"value":134},{"type":33,"value":589},"\"",{"type":33,"value":591}," — never the\nspecific number.",{"type":27,"tag":108,"props":593,"children":595},{"id":594},"l3-vs-l4-why-l3-is-not-in-the-dynamic-abi",[596,598,603],{"type":33,"value":597},"L3 vs L4 — why L3 is ",{"type":27,"tag":51,"props":599,"children":600},{},[601],{"type":33,"value":602},"not",{"type":33,"value":604}," in the dynamic ABI",{"type":27,"tag":47,"props":606,"children":607},{},[608,610,615,617,622],{"type":33,"value":609},"Legion's API is layered L1 (mesh/transport) → L2 (membership/identity) →\nL3 (capability ",{"type":27,"tag":51,"props":611,"children":612},{},[613],{"type":33,"value":614},"provider",{"type":33,"value":616}," surface) → L4 (consumer/app surface). Only ",{"type":27,"tag":51,"props":618,"children":619},{},[620],{"type":33,"value":621},"L4 is\nthe dynamic ABI",{"type":33,"value":623},":",{"type":27,"tag":625,"props":626,"children":627},"ul",{},[628,653],{"type":27,"tag":629,"props":630,"children":631},"li",{},[632,637,639,644,646,651],{"type":27,"tag":51,"props":633,"children":634},{},[635],{"type":33,"value":636},"L4 = dynamic ABI.",{"type":33,"value":638}," Apps and language bindings load ",{"type":27,"tag":36,"props":640,"children":642},{"className":641},[],[643],{"type":33,"value":41},{"type":33,"value":645}," and call\nexported ",{"type":27,"tag":36,"props":647,"children":649},{"className":648},[],[650],{"type":33,"value":134},{"type":33,"value":652}," symbols. This is the 129-symbol set above.",{"type":27,"tag":629,"props":654,"children":655},{},[656,661,663,669,671,677,679,684,686,691,693,699,700,779,783,785,791,793,798,800,806,808,814,815,821,823,829,830,836],{"type":27,"tag":51,"props":657,"children":658},{},[659],{"type":33,"value":660},"L3 = in-process header contract.",{"type":33,"value":662}," ",{"type":27,"tag":36,"props":664,"children":666},{"className":665},[],[667],{"type":33,"value":668},"sdk.h",{"type":33,"value":670}," (module register/dispatch, the L3\nKV wrapper, caps/membership queries) and ",{"type":27,"tag":36,"props":672,"children":674},{"className":673},[],[675],{"type":33,"value":676},"legion_identity.h",{"type":33,"value":678}," (cert/identity\nprimitives) are headers for ",{"type":27,"tag":51,"props":680,"children":681},{},[682],{"type":33,"value":683},"module authors",{"type":33,"value":685},", not dynamic-ABI symbols. They\nare deliberately ",{"type":27,"tag":51,"props":687,"children":688},{},[689],{"type":33,"value":690},"hidden",{"type":33,"value":692}," in the ",{"type":27,"tag":36,"props":694,"children":696},{"className":695},[],[697],{"type":33,"value":698},".so",{"type":33,"value":623},{"type":27,"tag":625,"props":701,"children":702},{},[703,722],{"type":27,"tag":629,"props":704,"children":705},{},[706,708,713,714,720],{"type":33,"value":707},"Built-in modules and tools that link the ",{"type":27,"tag":51,"props":709,"children":710},{},[711],{"type":33,"value":712},"static",{"type":33,"value":662},{"type":27,"tag":36,"props":715,"children":717},{"className":716},[],[718],{"type":33,"value":719},"liblegion.a",{"type":33,"value":721}," (default\nvisibility) resolve them directly.",{"type":27,"tag":629,"props":723,"children":724},{},[725,727,733,735,740,742,748,750,756,758,764,766,770,772,777],{"type":33,"value":726},"A dynamically-loaded (",{"type":27,"tag":36,"props":728,"children":730},{"className":729},[],[731],{"type":33,"value":732},"dlopen",{"type":33,"value":734},") module resolves them against the ",{"type":27,"tag":51,"props":736,"children":737},{},[738],{"type":33,"value":739},"host\nexecutable",{"type":33,"value":741}," — the runtime/tools link the static archive with\n",{"type":27,"tag":36,"props":743,"children":745},{"className":744},[],[746],{"type":33,"value":747},"--whole-archive --export-dynamic",{"type":33,"value":749},", putting the L3 symbols in the\nexecutable's dynamic table; the module's ",{"type":27,"tag":36,"props":751,"children":753},{"className":752},[],[754],{"type":33,"value":755},"legion_module_init_fn_v2",{"type":33,"value":757}," init\nreceives a ",{"type":27,"tag":36,"props":759,"children":761},{"className":760},[],[762],{"type":33,"value":763},"legion_plugin_manager_t *",{"type":33,"value":765}," handle to register against — ",{"type":27,"tag":147,"props":767,"children":768},{},[769],{"type":33,"value":602},{"type":33,"value":771},"\nfrom ",{"type":27,"tag":36,"props":773,"children":775},{"className":774},[],[776],{"type":33,"value":41},{"type":33,"value":778},".",{"type":27,"tag":780,"props":781,"children":782},"br",{},[],{"type":33,"value":784},"So ",{"type":27,"tag":36,"props":786,"children":788},{"className":787},[],[789],{"type":33,"value":790},"nm -D liblegion.so",{"type":33,"value":792}," correctly shows ",{"type":27,"tag":51,"props":794,"children":795},{},[796],{"type":33,"value":797},"none",{"type":33,"value":799}," of ",{"type":27,"tag":36,"props":801,"children":803},{"className":802},[],[804],{"type":33,"value":805},"legion_module_register",{"type":33,"value":807},",\n",{"type":27,"tag":36,"props":809,"children":811},{"className":810},[],[812],{"type":33,"value":813},"legion_l3_kv_set",{"type":33,"value":371},{"type":27,"tag":36,"props":816,"children":818},{"className":817},[],[819],{"type":33,"value":820},"legion_l3_caps_query",{"type":33,"value":822},", etc. That is by design — the L3\ncontract lives in headers + CI gates (",{"type":27,"tag":36,"props":824,"children":826},{"className":825},[],[827],{"type":33,"value":828},"check_sdk_header_no_runtime_symbols.sh",{"type":33,"value":807},{"type":27,"tag":36,"props":831,"children":833},{"className":832},[],[834],{"type":33,"value":835},"check_module_includes.sh",{"type":33,"value":837},"), not in the dynamic symbol table.",{"type":27,"tag":108,"props":839,"children":841},{"id":840},"how-the-boundary-is-enforced-defense-in-depth",[842],{"type":33,"value":843},"How the boundary is enforced (defense in depth)",{"type":27,"tag":845,"props":846,"children":847},"ol",{},[848,888,937,1017],{"type":27,"tag":629,"props":849,"children":850},{},[851,862,864,870,872,878,880,886],{"type":27,"tag":51,"props":852,"children":853},{},[854,860],{"type":27,"tag":36,"props":855,"children":857},{"className":856},[],[858],{"type":33,"value":859},"LEGION_API",{"type":33,"value":861}," decoration",{"type":33,"value":863}," (",{"type":27,"tag":36,"props":865,"children":867},{"className":866},[],[868],{"type":33,"value":869},"legion_compat.h",{"type":33,"value":871},") — expands to\n",{"type":27,"tag":36,"props":873,"children":875},{"className":874},[],[876],{"type":33,"value":877},"__attribute__((visibility(\"default\")))",{"type":33,"value":879}," (POSIX) / ",{"type":27,"tag":36,"props":881,"children":883},{"className":882},[],[884],{"type":33,"value":885},"__declspec(dllexport)",{"type":33,"value":887},"\n(Windows). Only decorated declarations are intended to export.",{"type":27,"tag":629,"props":889,"children":890},{},[891,900,902,908,910,916,918,923,925,929,930,935],{"type":27,"tag":51,"props":892,"children":893},{},[894],{"type":27,"tag":36,"props":895,"children":897},{"className":896},[],[898],{"type":33,"value":899},"C_VISIBILITY_PRESET hidden",{"type":33,"value":901}," on the ",{"type":27,"tag":36,"props":903,"children":905},{"className":904},[],[906],{"type":33,"value":907},"legion_shared",{"type":33,"value":909}," target\n(",{"type":27,"tag":36,"props":911,"children":913},{"className":912},[],[914],{"type":33,"value":915},"CMakeLists.txt",{"type":33,"value":917},") — every symbol from liblegion's ",{"type":27,"tag":147,"props":919,"children":920},{},[921],{"type":33,"value":922},"own",{"type":33,"value":924}," translation units\nthat is ",{"type":27,"tag":51,"props":926,"children":927},{},[928],{"type":33,"value":602},{"type":33,"value":662},{"type":27,"tag":36,"props":931,"children":933},{"className":932},[],[934],{"type":33,"value":859},{"type":33,"value":936}," becomes hidden. (Landed Foundation 06.04.)",{"type":27,"tag":629,"props":938,"children":939},{},[940,949,951,956,958,963,965,971,973,978,979,985,987,993,994,1000,1002,1008,1009,1015],{"type":27,"tag":51,"props":941,"children":942},{},[943],{"type":27,"tag":36,"props":944,"children":946},{"className":945},[],[947],{"type":33,"value":948},"-Wl,--exclude-libs,ALL",{"type":33,"value":950}," on ",{"type":27,"tag":36,"props":952,"children":954},{"className":953},[],[955],{"type":33,"value":907},{"type":33,"value":957}," — drops every ",{"type":27,"tag":51,"props":959,"children":960},{},[961],{"type":33,"value":962},"static-archive",{"type":33,"value":964},"\nsymbol from the dynamic table. Without this, the statically-linked\n",{"type":27,"tag":36,"props":966,"children":968},{"className":967},[],[969],{"type":33,"value":970},"libsodium.a",{"type":33,"value":972}," re-exported ",{"type":27,"tag":51,"props":974,"children":975},{},[976],{"type":33,"value":977},"~300",{"type":33,"value":662},{"type":27,"tag":36,"props":980,"children":982},{"className":981},[],[983],{"type":33,"value":984},"crypto_*",{"type":33,"value":986},"/",{"type":27,"tag":36,"props":988,"children":990},{"className":989},[],[991],{"type":33,"value":992},"sodium_*",{"type":33,"value":986},{"type":27,"tag":36,"props":995,"children":997},{"className":996},[],[998],{"type":33,"value":999},"randombytes_*",{"type":33,"value":1001},"\nsymbols straight through (visibility=hidden only governs liblegion's own\nobjects). Safe because every Legion binary links static sodium directly\n(",{"type":27,"tag":36,"props":1003,"children":1005},{"className":1004},[],[1006],{"type":33,"value":1007},"PUBLIC",{"type":33,"value":901},{"type":27,"tag":36,"props":1010,"children":1012},{"className":1011},[],[1013],{"type":33,"value":1014},"legion",{"type":33,"value":1016}," target), so nothing relies on the re-export.\n(GNU ld + lld — Linux, Android, and other ELF targets; skipped on Apple ld64.)",{"type":27,"tag":629,"props":1018,"children":1019},{},[1020,1025,1026,1031,1033,1039,1041,1047,1049,1055,1057,1063,1065,1071,1073,1078],{"type":27,"tag":51,"props":1021,"children":1022},{},[1023],{"type":33,"value":1024},"Header install split",{"type":33,"value":863},{"type":27,"tag":36,"props":1027,"children":1029},{"className":1028},[],[1030],{"type":33,"value":915},{"type":33,"value":1032}," install block) — public headers are\ninstalled under ",{"type":27,"tag":36,"props":1034,"children":1036},{"className":1035},[],[1037],{"type":33,"value":1038},"${INCLUDEDIR}/legion/",{"type":33,"value":1040},"; the internal headers\n",{"type":27,"tag":36,"props":1042,"children":1044},{"className":1043},[],[1045],{"type":33,"value":1046},"legion_wire.h",{"type":33,"value":1048}," (L2 wire), ",{"type":27,"tag":36,"props":1050,"children":1052},{"className":1051},[],[1053],{"type":33,"value":1054},"legion_vm.h",{"type":33,"value":1056}," (consensus-VM), ",{"type":27,"tag":36,"props":1058,"children":1060},{"className":1059},[],[1061],{"type":33,"value":1062},"legion_lnmp.h",{"type":33,"value":1064},"\n(LNMP), and ",{"type":27,"tag":36,"props":1066,"children":1068},{"className":1067},[],[1069],{"type":33,"value":1070},"legion_route_reply.h",{"type":33,"value":1072}," (route-query wire DTO — on the L4 include\nallow-list for in-tree tools but not shipped) are ",{"type":27,"tag":51,"props":1074,"children":1075},{},[1076],{"type":33,"value":1077},"deliberately not\ninstalled",{"type":33,"value":1079}," — they carry below-L4 internals.",{"type":27,"tag":108,"props":1081,"children":1083},{"id":1082},"ci-gates-that-keep-it-locked",[1084],{"type":33,"value":1085},"CI gates that keep it locked",{"type":27,"tag":243,"props":1087,"children":1088},{},[1089,1105],{"type":27,"tag":247,"props":1090,"children":1091},{},[1092],{"type":27,"tag":251,"props":1093,"children":1094},{},[1095,1100],{"type":27,"tag":255,"props":1096,"children":1097},{},[1098],{"type":33,"value":1099},"Gate",{"type":27,"tag":255,"props":1101,"children":1102},{},[1103],{"type":33,"value":1104},"Asserts",{"type":27,"tag":282,"props":1106,"children":1107},{},[1108,1162,1200,1222],{"type":27,"tag":251,"props":1109,"children":1110},{},[1111,1119],{"type":27,"tag":289,"props":1112,"children":1113},{},[1114],{"type":27,"tag":36,"props":1115,"children":1117},{"className":1116},[],[1118],{"type":33,"value":77},{"type":27,"tag":289,"props":1120,"children":1121},{},[1122,1124,1129,1130,1135,1137,1142,1143,1153,1155,1161],{"type":33,"value":1123},"Curated internal symbols are ",{"type":27,"tag":51,"props":1125,"children":1126},{},[1127],{"type":33,"value":1128},"absent",{"type":33,"value":371},{"type":27,"tag":51,"props":1131,"children":1132},{},[1133],{"type":33,"value":1134},"and",{"type":33,"value":1136}," the ",{"type":27,"tag":36,"props":1138,"children":1140},{"className":1139},[],[1141],{"type":33,"value":698},{"type":33,"value":123},{"type":27,"tag":51,"props":1144,"children":1145},{},[1146,1148],{"type":33,"value":1147},"only ",{"type":27,"tag":36,"props":1149,"children":1151},{"className":1150},[],[1152],{"type":33,"value":134},{"type":33,"value":1154}," (the positive boundary assertion — catches a reintroduced libsodium leak or a dropped ",{"type":27,"tag":36,"props":1156,"children":1158},{"className":1157},[],[1159],{"type":33,"value":1160},"--exclude-libs",{"type":33,"value":106},{"type":27,"tag":251,"props":1163,"children":1164},{},[1165,1188],{"type":27,"tag":289,"props":1166,"children":1167},{},[1168,1174,1175,1181,1182],{"type":27,"tag":36,"props":1169,"children":1171},{"className":1170},[],[1172],{"type":33,"value":1173},"check_ffi_symbols.sh",{"type":33,"value":371},{"type":27,"tag":36,"props":1176,"children":1178},{"className":1177},[],[1179],{"type":33,"value":1180},"check_l4_node_symbols.sh",{"type":33,"value":371},{"type":27,"tag":36,"props":1183,"children":1185},{"className":1184},[],[1186],{"type":33,"value":1187},"check_l4_util_symbols.sh",{"type":27,"tag":289,"props":1189,"children":1190},{},[1191,1193,1198],{"type":33,"value":1192},"The durable L4/FFI surface is ",{"type":27,"tag":51,"props":1194,"children":1195},{},[1196],{"type":33,"value":1197},"present",{"type":33,"value":1199}," (positive guard against accidental removal).",{"type":27,"tag":251,"props":1201,"children":1202},{},[1203,1217],{"type":27,"tag":289,"props":1204,"children":1205},{},[1206,1211,1212],{"type":27,"tag":36,"props":1207,"children":1209},{"className":1208},[],[1210],{"type":33,"value":828},{"type":33,"value":371},{"type":27,"tag":36,"props":1213,"children":1215},{"className":1214},[],[1216],{"type":33,"value":835},{"type":27,"tag":289,"props":1218,"children":1219},{},[1220],{"type":33,"value":1221},"The L3 SDK header contract / module include allowlist.",{"type":27,"tag":251,"props":1223,"children":1224},{},[1225,1241],{"type":27,"tag":289,"props":1226,"children":1227},{},[1228,1234,1235],{"type":27,"tag":36,"props":1229,"children":1231},{"className":1230},[],[1232],{"type":33,"value":1233},"check_install_files.sh",{"type":33,"value":371},{"type":27,"tag":36,"props":1236,"children":1238},{"className":1237},[],[1239],{"type":33,"value":1240},"check_pkgconfig.sh",{"type":27,"tag":289,"props":1242,"children":1243},{},[1244,1246,1252],{"type":33,"value":1245},"The installed-header set and ",{"type":27,"tag":36,"props":1247,"children":1249},{"className":1248},[],[1250],{"type":33,"value":1251},"legion.pc",{"type":33,"value":1253}," pkg-config surface.",{"type":27,"tag":108,"props":1255,"children":1257},{"id":1256},"stability-draft-status",[1258],{"type":33,"value":93},{"type":27,"tag":43,"props":1260,"children":1261},{},[1262],{"type":27,"tag":47,"props":1263,"children":1264},{},[1265,1267,1272,1274,1279,1281],{"type":33,"value":1266},"The L3/L4 public surfaces are ",{"type":27,"tag":51,"props":1268,"children":1269},{},[1270],{"type":33,"value":1271},"drafts, not release candidates.",{"type":33,"value":1273}," They are\ndocumented and locked-in-",{"type":27,"tag":147,"props":1275,"children":1276},{},[1277],{"type":33,"value":1278},"shape",{"type":33,"value":1280}," now so they can be reviewed; ",{"type":27,"tag":51,"props":1282,"children":1283},{},[1284],{"type":33,"value":1285},"names,\nsignatures, and groupings may still change.",{"type":27,"tag":47,"props":1287,"children":1288},{},[1289],{"type":33,"value":1290},"Two different things are \"locked\" to different degrees:",{"type":27,"tag":625,"props":1292,"children":1293},{},[1294,1351],{"type":27,"tag":629,"props":1295,"children":1296},{},[1297,1302,1303,1308,1310,1315,1316,1321,1323,1328,1330,1335,1336,1341,1343,1349],{"type":27,"tag":51,"props":1298,"children":1299},{},[1300],{"type":33,"value":1301},"The export boundary — LOCKED (and CI-enforced).",{"type":33,"value":662},{"type":27,"tag":36,"props":1304,"children":1306},{"className":1305},[],[1307],{"type":33,"value":41},{"type":33,"value":1309}," exports\n",{"type":27,"tag":147,"props":1311,"children":1312},{},[1313],{"type":33,"value":1314},"only",{"type":33,"value":662},{"type":27,"tag":36,"props":1317,"children":1319},{"className":1318},[],[1320],{"type":33,"value":134},{"type":33,"value":1322}," (no bundled third-party, no internal symbols), guaranteed by\n",{"type":27,"tag":36,"props":1324,"children":1326},{"className":1325},[],[1327],{"type":33,"value":859},{"type":33,"value":1329}," + ",{"type":27,"tag":36,"props":1331,"children":1333},{"className":1332},[],[1334],{"type":33,"value":899},{"type":33,"value":1329},{"type":27,"tag":36,"props":1337,"children":1339},{"className":1338},[],[1340],{"type":33,"value":948},{"type":33,"value":1342}," and the\n",{"type":27,"tag":36,"props":1344,"children":1346},{"className":1345},[],[1347],{"type":33,"value":1348},"test_internal_symbols_hidden",{"type":33,"value":1350}," gate. This invariant will not regress.",{"type":27,"tag":629,"props":1352,"children":1353},{},[1354,1359,1360,1365],{"type":27,"tag":51,"props":1355,"children":1356},{},[1357],{"type":33,"value":1358},"The symbol set — PRE-RELEASE DRAFT.",{"type":33,"value":662},{"type":27,"tag":147,"props":1361,"children":1362},{},[1363],{"type":33,"value":1364},"Which",{"type":33,"value":1366}," symbols are exported and their\nexact signatures are expected to change as the L3/L4 APIs are reviewed. No\nformal \"no removal / no signature change\" promise applies yet.",{"type":27,"tag":47,"props":1368,"children":1369},{},[1370,1372,1377],{"type":33,"value":1371},"The formal ABI-stability promise below takes effect from the ",{"type":27,"tag":51,"props":1373,"children":1374},{},[1375],{"type":33,"value":1376},"first tagged\nrelease",{"type":33,"value":1378},"; until then, treat the surface as movable:",{"type":27,"tag":625,"props":1380,"children":1381},{},[1382,1407,1424],{"type":27,"tag":629,"props":1383,"children":1384},{},[1385,1387,1392,1394,1399,1401,1406],{"type":33,"value":1386},"From the first release, within a major version: symbols are ",{"type":27,"tag":51,"props":1388,"children":1389},{},[1390],{"type":33,"value":1391},"not removed",{"type":33,"value":1393},",\nsignatures ",{"type":27,"tag":51,"props":1395,"children":1396},{},[1397],{"type":33,"value":1398},"do not change",{"type":33,"value":1400},", and new symbols may be ",{"type":27,"tag":51,"props":1402,"children":1403},{},[1404],{"type":33,"value":1405},"added",{"type":33,"value":778},{"type":27,"tag":629,"props":1408,"children":1409},{},[1410,1415,1417,1422],{"type":27,"tag":51,"props":1411,"children":1412},{},[1413],{"type":33,"value":1414},"Hidden",{"type":33,"value":1416}," symbols (everything not exported) carry ",{"type":27,"tag":51,"props":1418,"children":1419},{},[1420],{"type":33,"value":1421},"no",{"type":33,"value":1423}," stability contract\nand may change or disappear at any time.",{"type":27,"tag":629,"props":1425,"children":1426},{},[1427,1429,1434,1435,1440,1441,1446,1447,1452],{"type":33,"value":1428},"Internal headers (",{"type":27,"tag":36,"props":1430,"children":1432},{"className":1431},[],[1433],{"type":33,"value":1046},{"type":33,"value":371},{"type":27,"tag":36,"props":1436,"children":1438},{"className":1437},[],[1439],{"type":33,"value":1054},{"type":33,"value":371},{"type":27,"tag":36,"props":1442,"children":1444},{"className":1443},[],[1445],{"type":33,"value":1062},{"type":33,"value":807},{"type":27,"tag":36,"props":1448,"children":1450},{"className":1449},[],[1451],{"type":33,"value":1070},{"type":33,"value":1453},") are not part of the contract even if present in a\nsource checkout.",{"type":27,"tag":108,"props":1455,"children":1457},{"id":1456},"auditing-regenerating",[1458],{"type":33,"value":1459},"Auditing / regenerating",{"type":27,"tag":160,"props":1461,"children":1463},{"className":162,"code":1462,"language":164,"meta":21,"style":21},"# Current exported public ABI (should be only legion_*):\nnm -D --defined-only build/liblegion.so | awk '{print $3}' | grep '^legion_' | sort\n\n# Prove nothing else leaks (the CI gate, runnable locally):\nBUILD_DIR=build bash tests/check_internal_symbols_hidden.sh\n\n# Count by category:\nnm -D --defined-only build/liblegion.so | awk '{print $3}' | grep '^legion_' \\\n  | sed -E 's/^(legion_ffi)_.*/\\1_*/; s/^(legion_node)_.*/\\1_*/' | sort | uniq -c\n",[1464],{"type":27,"tag":36,"props":1465,"children":1466},{"__ignoreMap":21},[1467,1476,1527,1536,1544,1574,1582,1591,1640],{"type":27,"tag":170,"props":1468,"children":1469},{"class":172,"line":11},[1470],{"type":27,"tag":170,"props":1471,"children":1473},{"style":1472},"--shiki-default:#6A737D;--shiki-dark:#6A737D",[1474],{"type":33,"value":1475},"# Current exported public ABI (should be only legion_*):\n",{"type":27,"tag":170,"props":1477,"children":1478},{"class":172,"line":7},[1479,1483,1487,1491,1495,1499,1503,1507,1511,1515,1519,1523],{"type":27,"tag":170,"props":1480,"children":1481},{"style":176},[1482],{"type":33,"value":179},{"type":27,"tag":170,"props":1484,"children":1485},{"style":182},[1486],{"type":33,"value":185},{"type":27,"tag":170,"props":1488,"children":1489},{"style":182},[1490],{"type":33,"value":190},{"type":27,"tag":170,"props":1492,"children":1493},{"style":193},[1494],{"type":33,"value":196},{"type":27,"tag":170,"props":1496,"children":1497},{"style":199},[1498],{"type":33,"value":202},{"type":27,"tag":170,"props":1500,"children":1501},{"style":176},[1502],{"type":33,"value":207},{"type":27,"tag":170,"props":1504,"children":1505},{"style":193},[1506],{"type":33,"value":212},{"type":27,"tag":170,"props":1508,"children":1509},{"style":199},[1510],{"type":33,"value":202},{"type":27,"tag":170,"props":1512,"children":1513},{"style":176},[1514],{"type":33,"value":221},{"type":27,"tag":170,"props":1516,"children":1517},{"style":193},[1518],{"type":33,"value":226},{"type":27,"tag":170,"props":1520,"children":1521},{"style":199},[1522],{"type":33,"value":202},{"type":27,"tag":170,"props":1524,"children":1525},{"style":176},[1526],{"type":33,"value":235},{"type":27,"tag":170,"props":1528,"children":1529},{"class":172,"line":15},[1530],{"type":27,"tag":170,"props":1531,"children":1533},{"emptyLinePlaceholder":1532},true,[1534],{"type":33,"value":1535},"\n",{"type":27,"tag":170,"props":1537,"children":1538},{"class":172,"line":19},[1539],{"type":27,"tag":170,"props":1540,"children":1541},{"style":1472},[1542],{"type":33,"value":1543},"# Prove nothing else leaks (the CI gate, runnable locally):\n",{"type":27,"tag":170,"props":1545,"children":1547},{"class":172,"line":1546},5,[1548,1554,1559,1564,1569],{"type":27,"tag":170,"props":1549,"children":1551},{"style":1550},"--shiki-default:#E1E4E8;--shiki-dark:#E1E4E8",[1552],{"type":33,"value":1553},"BUILD_DIR",{"type":27,"tag":170,"props":1555,"children":1556},{"style":199},[1557],{"type":33,"value":1558},"=",{"type":27,"tag":170,"props":1560,"children":1561},{"style":193},[1562],{"type":33,"value":1563},"build",{"type":27,"tag":170,"props":1565,"children":1566},{"style":176},[1567],{"type":33,"value":1568}," bash",{"type":27,"tag":170,"props":1570,"children":1571},{"style":193},[1572],{"type":33,"value":1573}," tests/check_internal_symbols_hidden.sh\n",{"type":27,"tag":170,"props":1575,"children":1577},{"class":172,"line":1576},6,[1578],{"type":27,"tag":170,"props":1579,"children":1580},{"emptyLinePlaceholder":1532},[1581],{"type":33,"value":1535},{"type":27,"tag":170,"props":1583,"children":1585},{"class":172,"line":1584},7,[1586],{"type":27,"tag":170,"props":1587,"children":1588},{"style":1472},[1589],{"type":33,"value":1590},"# Count by category:\n",{"type":27,"tag":170,"props":1592,"children":1594},{"class":172,"line":1593},8,[1595,1599,1603,1607,1611,1615,1619,1623,1627,1631,1635],{"type":27,"tag":170,"props":1596,"children":1597},{"style":176},[1598],{"type":33,"value":179},{"type":27,"tag":170,"props":1600,"children":1601},{"style":182},[1602],{"type":33,"value":185},{"type":27,"tag":170,"props":1604,"children":1605},{"style":182},[1606],{"type":33,"value":190},{"type":27,"tag":170,"props":1608,"children":1609},{"style":193},[1610],{"type":33,"value":196},{"type":27,"tag":170,"props":1612,"children":1613},{"style":199},[1614],{"type":33,"value":202},{"type":27,"tag":170,"props":1616,"children":1617},{"style":176},[1618],{"type":33,"value":207},{"type":27,"tag":170,"props":1620,"children":1621},{"style":193},[1622],{"type":33,"value":212},{"type":27,"tag":170,"props":1624,"children":1625},{"style":199},[1626],{"type":33,"value":202},{"type":27,"tag":170,"props":1628,"children":1629},{"style":176},[1630],{"type":33,"value":221},{"type":27,"tag":170,"props":1632,"children":1633},{"style":193},[1634],{"type":33,"value":226},{"type":27,"tag":170,"props":1636,"children":1637},{"style":182},[1638],{"type":33,"value":1639}," \\\n",{"type":27,"tag":170,"props":1641,"children":1643},{"class":172,"line":1642},9,[1644,1649,1654,1659,1664,1668,1673,1677,1682],{"type":27,"tag":170,"props":1645,"children":1646},{"style":199},[1647],{"type":33,"value":1648},"  |",{"type":27,"tag":170,"props":1650,"children":1651},{"style":176},[1652],{"type":33,"value":1653}," sed",{"type":27,"tag":170,"props":1655,"children":1656},{"style":182},[1657],{"type":33,"value":1658}," -E",{"type":27,"tag":170,"props":1660,"children":1661},{"style":193},[1662],{"type":33,"value":1663}," 's/^(legion_ffi)_.*/\\1_*/; s/^(legion_node)_.*/\\1_*/'",{"type":27,"tag":170,"props":1665,"children":1666},{"style":199},[1667],{"type":33,"value":202},{"type":27,"tag":170,"props":1669,"children":1670},{"style":176},[1671],{"type":33,"value":1672}," sort",{"type":27,"tag":170,"props":1674,"children":1675},{"style":199},[1676],{"type":33,"value":202},{"type":27,"tag":170,"props":1678,"children":1679},{"style":176},[1680],{"type":33,"value":1681}," uniq",{"type":27,"tag":170,"props":1683,"children":1684},{"style":182},[1685],{"type":33,"value":1686}," -c\n",{"type":27,"tag":1688,"props":1689,"children":1690},"style",{},[1691],{"type":33,"value":1692},"html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":21,"searchDepth":7,"depth":7,"links":1694},[1695,1696,1697,1699,1700,1701,1702],{"id":110,"depth":7,"text":113},{"id":238,"depth":7,"text":241},{"id":594,"depth":7,"text":1698},"L3 vs L4 — why L3 is not in the dynamic ABI",{"id":840,"depth":7,"text":843},{"id":1082,"depth":7,"text":1085},{"id":1256,"depth":7,"text":93},{"id":1456,"depth":7,"text":1459},"markdown","content:abi.md","content","abi.md","abi","md",{"loc":5},1784532242628]