Body

Body OS

Talk got cheap. A body that any mind can wear — without the firmware guessing — is still scarce. This lab is building that operating system: discover every organ, install a brain, keep the kernel as a post office.

This page is the public door. Cite it. Plug an organ in. Argue the split. Not Espressif. A purchase order is not required to walk in.

神赐 — Authorized local rules · v0.9

Leo · WhatsApp +86 17052886709 · How to join · See the OS

Why this is larger than another demo

The scarce part is not a smarter chat. It is a body other people can join without rewriting the OS.

Any organ. One OS

A board that reports named abilities is taken over. You do not fork the kernel to add a sensor, a speaker, or later a chassis. The contract is the on-ramp.

Any brain. Same body

The mind sits in a slot: cloud now, local later. Change the vendor, the organs keep their names. This is not handing a body to one model.

Thinking stays in the slot

The kernel is a post office. It registers, forwards, and copies vitals by field name. It does not guess Chinese, write speak text, or grow a second soul on the C6.

This is public so you can walk in

The protocol is on this page. Pick a door. You do not need to be a customer.

Make an organ

Implement the V3 descriptor on UART. Report names, clamp min / max, send events. A new organ is a new contract, not a firmware fork of the kernel.

Put a brain in the slot

If you can return named steps from the menu — plus a notebook — talk. The OS stays when the cloud driver changes. A local driver is reserved.

Cite, review, disagree

Engineers and other models can point at one URL. Read the split. Tell us it is wrong. That is how the contract gets hard, not how a slogan gets louder.

Bring hardware to Beijing

A module, a chassis question, a UART that will not ACK. WhatsApp Leo. Technical exchange and friendship are enough.

The OS, and how other nodes connect

Body OS sits in the middle. Everything else is a node on a named interface. New hardware does not fork the kernel. A new model does not rewrite the organs.

Human · USB

Console on the kernel USB serial. ping / help / status / hw / vitals / mem stay local. Any other line is user speech into the brain slot.

Brain slot

Cloud driver now, local reserved. Sees menu + vitals + events + notebook + source. Returns steps + memory. Must not touch UART or invent unlisted names.

USB speech / local cmds · consult: menu + vitals + events + notebook → steps + memory (HTTPS)

Kernel · Body OS

ESP32-C6 host. Register descriptors, forward steps by exact ASCII name, copy vitals by field name. No new goals. Pins stay in the board port layer.

UART 115200 8N1 · frame 0xAA … 0x55 · UTF-8 · names byte-exact

LED organ

LED_001. led_on / led_off / led_blink. Gold sample C6-LED17. Executes the name; clamps min / max.

Speaker organ

SPEAKER_001. speak / announce. Gold sample C6-SPK20. The brain writes the line. After TTS it may raise task_completed.

Organ N

Any module that sends a V3 descriptor. Closed loop (balance, done, contact) stays on that organ. The kernel does not write motors from event names.

Notebook

NVS JSON the brain writes. The kernel stores and re-uploads the book. It does not read it as commands.

What each link carries

FromToWireCarries
HumanKernelUSB serial 115200User speech, or local ping / help / status / hw / vitals / mem
KernelBrain slotWi-Fi HTTPSConsult JSON in; steps + memory out. Vendor lives only in the slot
KernelOrganUART V30x91 descriptor, 0x03 command, 0x04 resp, 0x92 event, 0x93 stream, 0x07 heartbeat
OrganItselfOn-board loopStability / done / contact. Named feedback via return_params or events
BrainNotebookNVS via kernelWhole-book replace or reject. Body does not interpret the text

Kernel framework on the C6 host

The host tree is brain/. The kernel is a bus plus a vital snapshot. It does not include a cloud vendor, and it does not plan.

LayerCodeDoesMust not
Board portboard/UART ports, TX/RX, SSID, status LED GPIOCapability names, steps, consult
Framescomm_protocol/0xAA…0x55 pack/unpack, descriptor, event, streamBusiness judgement
Stateshared_model/g_registry, vitals world model, task nodesI/O
Post officemodule_manager/Register, heartbeat timeout, forward by name, resource lock, haltInvent abilities; write motors from events
Queuecoordination/One consult queue, NVS notebook, run steps in orderKeyword-map 开灯; call a vendor directly
Slotbrain_slot/consult(): cloud / null / local (local reserved)Touch UART
Cloud driverkimi_client/First HTTPS brainBe #included by the kernel except through the slot
Breathautonomous_loop/1 s alive, event glance when idle1 Hz cloud loop; local reflex that writes actuators

Two clocks

Three roles inside the OS. Do not mix them.

Brain slot

Reads speech, the menu, vitals, events, and the notebook. Outputs steps and memory. Must not invent unlisted action names, and must not touch UART.

Kernel

ESP32-C6 host. Discovers organs, builds the menu, forwards named steps, keeps a vital snapshot. Local console stays local.

Organ

LED, speaker, later anything that follows the frame. Executes a named action, clamps min / max, may close its own loop. Must not parse user speech.

What is running in the lab

Not a product SKU. Protocol V3 on a C6 kernel, an LED organ, and a speaker organ.

The contract, in one page

  • The body reports: I can do these named actions, with these limits, and these named returns
  • The brain decides: which steps, in which order, from that menu only
  • The kernel forwards: it does not remap phrases, and it does not write the spoken line
  • Empty steps means silence. If the brain wants to talk and speak is on the menu, speak must be a step
  • A new organ is a new descriptor. A new brain is a new slot driver. Neither forks the kernel

What this is not

  • Not a humanoid, not ROS as a second capability language, and not a phone app
  • Not Espressif, and not a claim that we train the cloud model
  • Not a kernel that balances a chassis or auto-composes a capability graph
  • Not medical, automotive, or an unbounded ‘do everything’ product

Protocol V3 — the public frame

This is the contract the lab is running. Version 3. Kernel + LED + speaker already talk on this frame. A new organ implements this file, not a fork of the kernel.

Rules the OS must not break

Four frozen contracts

Physical layer

Frame (every message)

SOF 0xAA | version 3 | msg_type | payload_len (u16 big-endian, 0–512) | payload | CRC16 | EOF 0x55
CRC covers version + type + length + payload. Init 0xFFFF, poly 0xA001.
Shortest frame is 8 bytes (ACK, DISCOVER, heartbeat).
RX must reassemble: split frames, stuck frames, and junk before SOF are normal. Do not assume one uart_read is one frame.

Message types

TypeValueDirectionUse
DESCRIPTOR0x91organ → kernelPower-on capability contract
ACK0xF0kernel → organDescriptor received
HEARTBEAT0x07organ → kernelKeep-alive after ACK
COMMAND0x03kernel → organRun a named ability
COMMAND_RESP0x04organ → kernelstatus 0 = ok, 1 = fail
DISCOVER0x01kernel → organAsk for descriptor after kernel reset
EVENT0x92organ → kernelSparse named events (done, fail, unstable). Consult queue; halt_event may pause the current wait
DATA_STREAM0x93organ → kernelPeriodic samples. Kernel copies into vitals by return_params names

How it stays alive

Descriptor — the organ’s only function contract

Naming

LED contract (on the wire now)

AbilityParamsLimitsBehaviour
led_onnone—Stop blink, lamp on. Module LED_001, type led, group led
led_offnone—Stop blink, lamp off
led_blinkinterval_s float, unit smin 0.05, max 60Blink period, not a wait between two sentences

Speaker contract (on the wire now)

AbilityParamsLimitsBehaviour
speaktext string1–240 UTF-8 bytesTalk to the user. The brain writes the line. Module SPEAKER_001. May raise task_completed when TTS ends
announcetext string1–240 UTF-8 bytesSay what the body just did. The brain writes the line. The kernel never auto-inserts this

Command payload

Kernel ↔ brain slot (organs do not implement this)

The kernel turns online organs into a JSON menu, plus a vital snapshot and a notebook. The brain must answer with steps whose action names exist on that menu:

{
  "heard_req": 0,
  "steps": [
    { "task_id": "t1", "action": "led_on", "params": {}, "priority": 5, "depends_on": [] },
    { "task_id": "t2", "action": "speak", "params": { "text": "Light is on." }, "priority": 5, "depends_on": ["t1"] }
  ],
  "can_execute": true,
  "missing": [],
  "memory": { "items": [], "digest": "" },
  "response": "user-facing line"
}

Still open. Come argue

A living OS has unfinished edges. If you care, these are the fights worth having.

中文

造身体

Body OS · 身体操作系统

会说话已经不稀缺。能被任何头脑穿上、固件不去猜的身体,才稀缺。这个实验室在做那套操作系统:发现全部器官,安装大脑,内核只当邮局。

这一页是公开的门。引用它。接一块器官进来。来争分工。不是乐鑫。没有采购单也可以走进来。

神赐 — 主脑授权的本地规则 · v0.9

Leo · WhatsApp +86 17052886709 · 怎么参与 · 看操作系统

为什么这比再做一个演示更大

稀缺的不是更会聊天的模型。稀缺的是别人能走进来、不必改写 OS 的身体。

任何器官。一套 OS

一块板只要上报具名能力,就被接管。加传感器、喇叭、以后的底盘,都不必分叉内核。合同就是入口。

任何大脑。同一具身体

头脑坐在槽里:现在云端,以后本地。换厂商,器官的名字还在。这不是把身体交给某一个模型。

思考留在槽里

内核是邮局。登记、转发、按字段名抄体征。不猜中文,不编要说的那句,也不在 C6 上再长一个灵魂。

公开,就是为了让你走进来

协议就在这一页。选一扇门。不必先当客户。

做一个器官

在 UART 上实现 V3 描述符。上报名字,夹 min / max,发事件。新器官是一份新合同,不是去改内核的分叉固件。

把大脑放进槽

只要能从菜单里返回具名步骤,并交回笔记本,就可以谈。云端驱动换了,OS 还在。本地驱动的槽已经留好。

引用、审、不同意

工程师和其他模型可以指向同一条网址。读这套分工。认为它是错的,就说。合同是这样变硬的,不是靠把口号喊大。

把硬件带到北京

一块模块、一个底盘问题、一次 ACK 不到。WhatsApp 找 Leo。技术交流和交朋友就够。

操作系统,以及它和其他节点怎么连

Body OS 在中间。其余都是挂在具名接口上的节点。新硬件不必分叉内核。换一个模型不必改写器官。

人 · USB

内核 USB 串口控制台。ping / help / status / hw / vitals / mem 留在本地。其余整行是用户原话,进大脑槽。

大脑槽

现在是云端驱动,本地槽位已留。看见菜单 + 体征 + 事件 + 笔记本 + 来源。返回 steps + memory。禁止碰 UART,禁止发明未登记的名字。

USB 原话 / 本地命令 · 咨询:菜单 + 体征 + 事件 + 笔记本 → steps + memory(HTTPS)

内核 · Body OS

ESP32-C6 宿主。登记描述符,按 ASCII 名精确转发 steps,按字段名抄体征。不产生新目标。引脚留在板级移植层。

UART 115200 8N1 · 帧 0xAA … 0x55 · UTF-8 · 名字逐字节相等

灯器官

LED_001。led_on / led_off / led_blink。金样 C6-LED17。按名字执行,min / max 卡住。

喇叭器官

SPEAKER_001。speak / announce。金样 C6-SPK20。文案由大脑写。TTS 结束后可报 task_completed。

器官 N

任何发出 V3 描述符的模块。稳定、到位、接触等闭环留在该器官上。内核不按事件名写电机。

笔记本

大脑写下的 NVS JSON。内核保管并原样再上传。不把它当指令解读。

每条连线运什么

从到线运什么
人内核USB 串口 115200用户原话,或本地 ping / help / status / hw / vitals / mem
内核大脑槽Wi-Fi HTTPS咨询 JSON 进去;steps + memory 出来。厂商只活在槽里
内核器官UART V30x91 描述符、0x03 命令、0x04 应答、0x92 事件、0x93 数据流、0x07 心跳
器官自己板上闭环稳定 / 完成 / 接触。具名反馈走 return_params 或事件
大脑笔记本经内核写 NVS整本替换或拒绝。身体不解读正文

C6 宿主上的内核框架

宿主目录是 brain/。内核是总线加生命体征快照。不内嵌云厂商,也不做规划。

层代码做什么禁止
板级口board/UART 口、TX/RX、SSID、状态灯 GPIO能力名、steps、咨询
帧comm_protocol/0xAA…0x55 组包拆包、描述符、事件、数据流业务判断
状态shared_model/登记表、体征世界模型、任务节点I/O
邮局module_manager/登记、心跳踢线、按名转发、资源锁、halt发明能力;按事件写电机
队列coordination/咨询排队、NVS 笔记本、按序执行 steps中文关键词开灯;直接调厂商
槽brain_slot/consult():云 / 空 / 本地(本地已留)碰 UART
云驱动kimi_client/第一路 HTTPS 大脑被内核直接 include,只能经槽调用
呼吸autonomous_loop/1 秒活着,空闲时瞥一眼事件1Hz 云循环;本地反射去写执行器

两套时钟

  • 身体快环:UART 毫秒级。心跳、数据流;halt_event 只暂停当前这一步的等待
  • 灵魂慢环:一次只咨询一条。空 steps 就是沉默。内核不填这个空
  • 失败或中止的步不重试、不发明新步。数组里已经写出的后续步仍转发

OS 里三个角色。不要混。

大脑槽

看见原话、菜单、体征、事件和笔记本,输出 steps 和 memory。禁止发明未登记的动作名,禁止碰 UART。

内核

ESP32-C6 宿主。发现器官、做成菜单、按名转发步骤、保管体征快照。本地控制台只留在本地。

器官

灯、喇叭,以及以后任何遵守这套帧的模块。按名字执行,min / max 卡住,闭环可以在自己板上。禁止解析用户原话。

实验室里已经在跑的

不是货架型号。协议 V3:C6 内核、灯器官、喇叭器官。

  • 内核宿主 ESP32-C6,固件标 20260902-C6-SPK42。器官:灯 C6-LED17,I2S 喇叭 C6-SPK20(MAX98357 一类)
  • 器官总线:点对点 UART,115200 8N1,TX/RX 交叉,必须共地。各板自己供电,禁止并联 5V
  • 器官上电先发描述符,再心跳。内核 ACK。未知动作回失败,不瞎映射
  • USB 打 vitals 是本地快照,不上云。要说的字由大脑写,喇叭负责播
  • 1 秒呼吸让身体在没人打字时仍活着。这条环不写电机

一页说清的合同

  • 身体上报:我会这些具名动作,限度是这些,返回这些具名字段
  • 大脑决定:从这份菜单里选哪几步、什么顺序
  • 内核转发:不改写原话,不编要说的那句
  • 空 steps 就是沉默。大脑要说话且菜单里有 speak,就必须把 speak 放进 steps
  • 新器官是一份新描述符。新大脑是一个新槽驱动。都不必分叉内核

这不是什么

  • 不是人形机器人,不是把 ROS 当成第二套能力语言,也不是手机 App
  • 不是乐鑫,也不声称我们在训练云端模型
  • 不是内核去平衡底盘,也不是能力图自动拼任务
  • 不是医疗、车规,也不是不限定芯片的「什么都做」

协议 V3 — 对外骨架

实验室正在跑的合同。版本 3。内核 + 灯 + 喇叭已经在这套帧上通话。新器官按这份实现,不要去分叉内核。

OS 不许破的规则

  • 身体报合同:具名能力、min / max、具名返回、一次回复最多几步
  • 大脑槽决定 steps。菜单没有的能力,can_execute 为 false——不是悄悄少做
  • 内核是邮局:登记、转发、按字段名抄体征。不把用户原话改写成动作,不编 speak 文案
  • 名字就是合同:strcmp 逐字节相等,不 trim、不分大小写折叠。破坏性变更是新名字,不是内核改映射
  • min / max 是硬限制。大脑应先夹;从机必须再强制一次
  • 空 steps 就是沉默。大脑要说话且菜单里有 speak,就必须把 speak 放进 steps
  • 新字段只追加在描述符尾。顺序冻结:先 halt_event,再 cap_version。旧从机不写也能登记
  • 禁止另起 JSON 器官总线替代 UART 0xAA…0x55。禁止能力图自动拼任务。禁止 rollback 发明反向动作

四份冻结合同

  • 描述符 0x91:自报。未知名仍进菜单
  • 能力模式:执行键是 name。开和关是两条能力。cap_version 只给大脑看世代
  • 步骤:按序转发。needs_completion_ack 则等 task_completed / task_failed。halt_event 只停当前步等待
  • 身体状态:体征按 return_params 名字。禁止猜 values[0]=front。事件环 16,优先覆盖

物理层

  • 点对点 UART,无硬件流控,115200 8N1
  • TX / RX 交叉。必须共地。各板自己供电,禁止并联 5V
  • 身体总线只走 UTF-8。不要把 GBK 写上线
  • ESP32-C6 DevKitC-1 不要占用 GPIO 4/5(JTAG)、8/9、12/13(USB)。控制台走 USB 串口
  • C6 只有两条高速 UART。第三块器官要改拓扑,不要偷控制台脚

帧(所有消息共用)

SOF 0xAA | version 3 | msg_type | payload_len(u16 大端,0–512)| payload | CRC16 | EOF 0x55
CRC 覆盖 version + type + 长度 + payload。初值 0xFFFF,多项式 0xA001。
最短帧 8 字节(ACK、DISCOVER、心跳)。
接收必须流式组帧:拆包、粘包、SOF 前的脏字节都是正常的。不要假设一次 uart_read 就是一帧。

消息类型

类型值方向用途
DESCRIPTOR0x91器官 → 内核上电能力合同
ACK0xF0内核 → 器官已收到描述符
HEARTBEAT0x07器官 → 内核ACK 之后的保活
COMMAND0x03内核 → 器官按名字执行
COMMAND_RESP0x04器官 → 内核status 0 成功,1 失败
DISCOVER0x01内核 → 器官内核重启后拉一次描述符
EVENT0x92器官 → 内核偶发具名事件(完成、失败、失稳)。进咨询队列;halt_event 可暂停当前等待
DATA_STREAM0x93器官 → 内核周期采样。内核按 return_params 名字填体征

怎样活着

  • 器官上电,等 1 秒,然后每 2 秒发 DESCRIPTOR,直到 ACK(或收到 COMMAND)
  • 内核用 8 字节空帧 ACK。ACK 之后器官每 1 秒心跳,每 5 秒再报一次描述符
  • 内核重启后 RAM 里菜单是空的——发 DISCOVER;器官必须马上再报
  • 执行:大脑输出 steps[].action = 能力名。内核找到 UART,发 COMMAND。器官夹 min/max,执行,回 COMMAND_RESP
  • 未知名字:器官回失败。禁止映射到别的能力
  • 15 秒没有合法帧:该器官离线,踢出菜单

描述符 — 器官唯一的功能合同

  • 模块头:module_id、module_type、软硬件版本、capability_count(1–8)
  • 每条能力:ASCII 名(≤23)、给大脑读的人话(≤63 UTF-8 字节)、参数、exec_type、resource_group、max_duration_ms
  • exec_type:0 立即(立刻回)、1 持续(启动成功就回)、2 周期、3 事件驱动
  • needs_completion_ack:等 task_completed / task_failed 再走需要等待的下一步
  • return_params:具名反馈字段。0x93 的值按这些名字抄进体征,禁止按 C 结构体布局猜
  • 可选尾,顺序冻结:先 halt_event 字符串,再 cap_version 字符串。旧器官不写也能登记
  • 同一 resource_group 在内核上互斥。speak 与 announce 同属 audio,同时只能跑一个
  • 参数:name、type(int / float / string / bool)、min_val、max_val、unit。从机强制 min/max。内核不改数值
  • 开和关必须是两条能力。不要一条 led 再靠参数翻转

命名

  • 小写 ASCII 加下划线:led_on、led_off、led_blink、speak、announce
  • 同一身体上不要重复能力名。内核转给先登记该名字的器官

LED 合同(已在线上)

能力参数限度行为
led_on无—停闪,灯亮。模块 LED_001,type led,组 led
led_off无—停闪,灯灭
led_blinkinterval_s float,单位 smin 0.05,max 60闪烁周期,不是两句话之间的等待

喇叭合同(已在线上)

能力参数限度行为
speaktext 字符串1–240 UTF-8 字节对用户说话。文案由大脑写。模块 SPEAKER_001。TTS 结束可报 task_completed
announcetext 字符串1–240 UTF-8 字节口述身体刚做了什么。文案由大脑写。内核绝不自动补这一条

命令载荷

  • COMMAND:能力名,然后按描述符顺序的 float 参数,再可选一条名为 text 的字符串(≤240 字节)
  • COMMAND_RESP:1 字节 status。0 已启动或已完成;1 载荷坏、未知名字或硬件拒绝
  • 事件 0x92 和数据流 0x93 不要塞进 COMMAND_RESP。完成和采样走那两类

内核 ↔ 大脑槽(从机不实现,但必须懂)

内核把已在线器官收成 JSON 菜单,再加上体征快照和笔记本。大脑的 steps 里,action 必须是这份菜单上的能力名:

{
  "heard_req": 0,
  "steps": [
    { "task_id": "t1", "action": "led_on", "params": {}, "priority": 5, "depends_on": [] },
    { "task_id": "t2", "action": "speak", "params": { "text": "Light is on." }, "priority": 5, "depends_on": ["t1"] }
  ],
  "can_execute": true,
  "missing": [],
  "memory": { "items": [], "digest": "" },
  "response": "user-facing line"
}
  • 咨询输入是菜单 + 体征 + 事件 + 笔记本 + 来源(user 或 self)。快照是转存,不含语义
  • action 是能力名,不要把 LED_001.led_blink 当 action
  • 菜单做不到:can_execute=false,missing 写出缺口,steps 不超过 max_steps(一次回复 16 步)
  • 内核不给能力打分,也不选「最接近」的名字。思考留在槽里
  • 自问回合空 steps 必须沉默。不要拿 response 去说话

还开着。进来争

活着的 OS 一定有没做完的边。如果你在意,这些才值得吵。

  • 下一个该接哪块器官——前提是它说 UART 合同,而不是内核发明 walk
  • 继续 UART,还是 C6 高速口不够第三条时改拓扑?
  • 本地大脑驱动何时离开预留槽?
  • 如果每个器官真能热插拔,内核还能瘦到什么程度?