# moonnat 宪法(const)—— 纯核总纲纪律

版本:v1.0(2026-10-28 立卷;定谳源 = vox1000 T4.1 侦察(moonlink nat 评审)+
立项评审 2026-10-28)
表述纪律:本卷只允许「必须 / 禁止」句式;论证与考据归茗篇,本卷只立律。

---

## 1. 纯核律

1. **必须**:画像(nat 类型判定)/ 打洞决策 / 重试与端口预测 = **纯函数**
   同步形,时间一律 `now : Int64`(毫秒)注入,熵(nonce 种子)一律
   注入口;**禁止**核心包取钟、睡眠、取随机。
2. **必须**:STUN(RFC 8489)报文编解码 = **标准遵循层**(唯一"不可任意
   改"的层)——报文格式自实现,已知答案向量对拍即门;**禁止**引第三方
   STUN 依赖。
3. **必须**:核心包依赖白名单 = 仅 `moonbitlang/async`(async test 授亲);
   **禁止**依赖 vox1000 / moonrelay / moonlink 或任何协议仓——纯核自足,
   缝面自备最小探针口(send / recv / now),消费方 adapter 桥接
   (moonkcp→vox1000 同款生态位)。
4. **必须**:**单真变点律**——moonnat 的 port 只有**探针口**一枚
   (T4 落 `pub(open) trait ProbeSocket`,形随 vox1000 SeamNet:send /
   recv async、now_ms sync;跨包可实现纪律);其余一律 = 纯函数 +
   注入参数 + 数据,**禁止**再立 trait(`StunServer` / `NatProfiler`
   等与 vox1000 禁 `Transport` trait 同罪——变点之外不再立 trait)。
5. **必须**:STUN 编解码 / 画像机 / 打洞 reducer 归位**域件**(纯函数,
   标准遵循层——RFC 8489 是标准不是变点);时间与熵 = 注入参数,
   **禁止**立 Clock / Entropy trait(moongard 先例同款:核心零时钟
   零随机,注入不立面)。

## 2. 观测纪律(autonat v2)

1. **必须**:地址观测以**带外回执 / STUN 应答 / dial-back 实测**为据;
   自报形(nat_type 类)**禁止**作决策输入(只可作 hint 记录,不进
   判定)。
2. **必须**:探针携带 nonce,应答 echo 核对——防混淆;打洞对端验证 =
   dial-back 回连实测——防谎报。
3. **必须**:观测源优先序(home relay 回执 > STUN > 对端 observedAddr >
   UPnP/PCP)只作优先序不作唯一源;UPnP/PCP 后置,不进 v1。

## 3. 打洞编排律

1. **必须**:打洞状态机 = 纯函数 reducer 形(vox1000 `dial_next` 同款:
   state × event → action);重试节奏与端口预测策略可配(策略参数注入,
   缺省值可调但**不在核心写死任何外部端点**)。
2. **必须**:无默认 STUN / relay / 种子服务器名单——配置注入或文档示例
   地址,剥离纪律(vox1000 开源边界 §三护栏同款)。
3. **禁止**:核心词汇表出现消费方词汇(SeamNet / Path / Connection 等)
   ——桥接面住消费方 adapter,本件不反向知晓。

## 4. 工程守卫律

1. **必须**:每阶段绿门 = `moon test` + `moon info` + `moon fmt`,核
   `.mbti` diff;编解码面已知答案向量罐先行。
2. **必须**:代码小修入 `ctx.md` 即时账本,设计定谳入 `.mingspace/`
   茗篇;三震报停律全程有效(根 AGENTS.md 同款)。

---

## 附:目录对位(T0 立骨架即落)

```
moonnat/
  core/           ← 纯核:报文编解码 / 画像机 / 打洞 reducer(律 1/2/3)
  adapter/        ← IO 面:真 UDP 探针口 + 真 STUN 对话(候 T4)
  examples/       ← 对打 demo(候 T4 后)
```

定谳索引:`.mingspace/moonnat_ming.md`(立项篇);开工序 = `todo.md`;
小修账 = `ctx.md`。
