diff --git a/README.md b/README.md index e7cf16b..83a6623 100644 --- a/README.md +++ b/README.md @@ -127,6 +127,10 @@ flowchart TD 阶段编号表示依赖关系,不代表承诺日期。每一阶段只有形成可重复实验和对照证据后,才会 从 `Planned` 更新为 `Validated`。 +R0 当前仍未关闭。下一步且仅允许继续 R0 的工具链锁、机器合同、Linux reference lab 与干净 +恢复证据;[R0 闭环与 R1 准入门](docs/r0-closure-gate.md)全部通过以前,禁止创建 R1 内核或 +后续阶段的占位实现。即使 R0 关闭,也只获得 R1 准入资格,不自动开始 R1。 + 路线按架构层分成三个后续阶段带:R1–R3 建立确定性执行、权限与证据底座,R4–R5 只在其上研究 不可信观测和策略,R6–R7 再扩展连续性与规模。R0 的职责不是提前堆模块,而是冻结这些依赖 方向、交接合同、状态所有权和阶段门禁。分层表示高内聚模块与单向依赖,不表示每层都拆成 @@ -149,6 +153,10 @@ flowchart TD - [前人工作比较矩阵](docs/prior-art-matrix.md) - [研究证据追踪](docs/research-evidence-traceability.md) - [R0 文献门禁记录](docs/r0-literature-gate.md) +- [R0 工具链冻结合同](docs/r0-toolchain-freeze.md) +- [R0 最小交接合同](docs/r0-contract-freeze.md) +- [R0 Linux Reference Lab 冻结合同](docs/r0-reference-lab-freeze.md) +- [R0 闭环与 R1 准入门](docs/r0-closure-gate.md) - [威胁模型与安全不变量](docs/threat-model.md) ## 项目谱系 diff --git a/docs/evidence/r0-host-inventory-2026-09-03.md b/docs/evidence/r0-host-inventory-2026-09-03.md new file mode 100644 index 0000000..276c529 --- /dev/null +++ b/docs/evidence/r0-host-inventory-2026-09-03.md @@ -0,0 +1,32 @@ +# R0 宿主工具盘点:2026-09-03 + +状态:`OBSERVED · R0 ENVIRONMENT BOUNDARY` + +本记录是一次只读宿主盘点,不是工具链冻结合同,也不证明 Linux reference lab、FlowKernel +target 或干净机器恢复已经成立。后续环境变化追加新记录,不回写本次观察。 + +## 观察范围 + +工作目录为 FlowKernel 仓库。盘点只查询命令可见性、版本和 WSL 发行版状态;没有安装、启动、 +升级或删除工具,也没有启动 Docker Desktop。 + +## 观察结果 + +- Git `2.55.0.windows.2` 与 Node `v24.14.0` 可用; +- Windows 上存在 MinGW GCC、CMake 和 Ninja,但它们尚未被接受为 freestanding target + 工具链; +- Windows PATH 中没有 Clang 和 `qemu-system-x86_64`; +- WSL 功能存在,但只列出已停止的 `docker-desktop` 发行版,没有可用的通用 Linux lab; +- Docker CLI 存在,但本轮没有启动或依赖 Docker Desktop。 + +## 裁决 + +| 子门 | 本次裁决 | 原因 | +| --- | --- | --- | +| Repository gate | `AVAILABLE` | 当前 Node 可以运行仓库门禁 | +| Target build/emulation | `PENDING` | 未发现已接受的 Clang/cross compiler 与 QEMU 组合 | +| Linux reference lab | `PENDING` | 没有可用通用 Linux 发行版 | +| Clean-machine recovery | `PENDING` | 尚无精确工具锁和第二环境重建证据 | + +因此本次观察不能关闭 R0,也不能授权进入 R1。下一次重验应在工具链候选和通用 Linux 环境 +准备完成后,以新日期、新环境和新 evidence identity 追加记录。 diff --git a/docs/experiment-roadmap.md b/docs/experiment-roadmap.md index 2272382..e4a5c0d 100644 --- a/docs/experiment-roadmap.md +++ b/docs/experiment-roadmap.md @@ -38,6 +38,10 @@ 可重复 workload、指标、Linux 传统策略对照组和现有 agentic scheduler control-plane 基线。 此阶段不写空内核制造进度。 +R0 的子门、最小纵向闭环和 R1 硬阻断见 +[R0 闭环与 R1 准入门](r0-closure-gate.md)。当前只允许继续工具链、机器合同、Linux reference +lab 和干净恢复工作;关闭 R0 只获得 R1 准入资格,不自动开始 R1。 + 最低证据: - 固定硬件、宿主内核、编译器、链接器、模拟器、运行时和 workload 版本; @@ -58,6 +62,10 @@ 复跑,记录 workload 分析、策略选择/合成、Execution Verifier、部署 token、canary、fallback、 Agent 成本和失败结果;条件不满足时标记 `BOUNDARY / PENDING`,不把论文结果冒充本机证据。 +R0 工具、合同和实验台的冻结文本分别见 +[工具链冻结合同](r0-toolchain-freeze.md)、[最小交接合同](r0-contract-freeze.md)和 +[Linux Reference Lab 冻结合同](r0-reference-lab-freeze.md)。 + ## R1:最小 C 内核、静态身份句柄与生命周期状态机 目标:在固定平台上建立可重复启动、停止和故障退出的最小 C 内核,完成时钟、中断、最小 diff --git a/docs/r0-closure-gate.md b/docs/r0-closure-gate.md new file mode 100644 index 0000000..42f45b3 --- /dev/null +++ b/docs/r0-closure-gate.md @@ -0,0 +1,89 @@ +# R0 闭环与 R1 准入门 + +状态:`R0 PLANNED · CLOSURE WORK ONLY · R1 ENTRY PROHIBITED` + +本门禁把“继续完善 R0”和“开始写 R1 内核”分开。R0 的目标不是堆空模块,而是留下一个可以 +从干净环境恢复、运行、失败、读回并独立验收的研究底板。在本页全部关闭前,不创建 R1 内核 +源码、启动汇编、链接脚本或占位模块。 + +## 1. 子门状态 + +| 子门 | 当前状态 | 关闭证据 | +| --- | --- | --- | +| R0-L 文献与前人工作 | `CLOSED` | [R0 文献门禁记录](r0-literature-gate.md) | +| R0-A 宪法、可信边界和阶段分层 | `DESIGNED` | 宪法、威胁模型、所有权、跨带依赖和重验规则接受审查 | +| R0-T 工具链 | `PENDING` | 精确版本锁、启动交接选择、干净恢复和模拟器 smoke evidence | +| R0-C 最小交接合同 | `PENDING` | 机器 schema、正反 fixtures、演进规则和独立 verifier | +| R0-LAB Linux reference lab | `PENDING` | 同语义基线、失败/恢复、独立读回和离线证据包 | +| R0-R 仓库恢复 | `PENDING` | 干净克隆只依赖仓库、公开工具来源和一个非交互入口完成 R0 验证 | + +`DESIGNED` 不是 `CLOSED`。本表不能因为文档数量增加而自动升级。 + +## 2. R0 自身的最小纵向闭环 + +R0 即使不实现内核,也必须真实跑通: + +```text +clean clone +→ restore locked R0 tools +→ verify versioned contracts and negative fixtures +→ launch bounded Linux reference workload +→ submit one typed ActionProposal +→ deterministic authority returns ALLOW / CLAMP / DENY +→ lab mechanism attempts only the authorized bounded action +→ read back actual state from an independent fact source +→ preserve execution, observation and recovery evidence +→ produce PASS / FAIL / INCONCLUSIVE / BOUNDARY +→ stop all lab processes +→ verify evidence offline +→ verify no undeclared residual state +``` + +这条闭环可以使用宿主侧 deterministic fixture 表达 R0 合同,但不能假装它是 FlowKernel C +target。它验证的是工具、合同、reference lab 与证据方法已经足以支持 R1 施工。 + +## 3. R0 总退出条件 + +只有以下条件全部成立,R0 才能从 `Planned` 更新: + +1. R0-L、R0-A、R0-T、R0-C、R0-LAB 和 R0-R 均为 `CLOSED`; +2. 每条成功、失败和边界结论都有不可变 commit、环境、合同、fixture 和 evidence identity; +3. Harness、deterministic authority、resource mechanism、Acceptance 四层不共享凭据、私有可变 + 状态、特权旁路或最终 authority; +4. Linux reference lab 的成功没有写成 FlowKernel target 的实现事实; +5. 负例至少覆盖越权 Proposal、撤销/过期 Capability、状态版本冲突、Guard 拒绝、机制失败、 + 独立读回冲突、证据损坏、恢复失败和残留状态; +6. 干净环境能以一个文档化、非交互入口完成验证; +7. 所有 `PENDING` 要么完成,要么凭真实环境观察收敛为带重验条件的 `BOUNDARY`; +8. 公开限制、宿主 failure domain 和尚未证明的性质保持可见; +9. R0 review 记录精确 revision,并在通过后创建独立的不可变 freeze coordinate。 + +建议冻结坐标为 `r0-baseline-v1`,但在总门禁通过前不得创建该 tag,也不得发布暗示 R1 已开始 +的版本。 + +## 4. 明确禁止的跨级施工 + +R0 关闭前不得: + +- 创建“先放着”的 R1 kernel、scheduler、Guard 或 lifecycle 空实现; +- 用 Linux cgroup、eBPF 或 `sched_ext` 代码冒充 FlowKernel target; +- 把 Harness 接到真实特权执行入口后再补 Capability; +- 为了演示而绕过独立读回、失败证据或残留检查; +- 提前实现 R2–R7 的学习、多核、多节点、迁移或动态委托; +- 用本机一次成功替代干净克隆、固定工具链和离线证据验证。 + +## 5. 下一步且仅此一步 + +R0 文献线已经关闭。下一施工顺序固定为: + +```text +R0-T 工具链候选验证与精确锁 +→ R0-C 机器合同与正反 fixtures +→ R0-LAB reference lab runner、失败用例与独立读回 +→ R0-R 干净恢复 +→ R0 总复核与冻结 +→ STOP +``` + +到达 `STOP` 只表示具备 R1 准入资格。是否开始 R1 必须由新的明确决定触发,不能由脚本、路线图 +或 R0 关闭自动触发。 diff --git a/docs/r0-contract-freeze.md b/docs/r0-contract-freeze.md new file mode 100644 index 0000000..2986f43 --- /dev/null +++ b/docs/r0-contract-freeze.md @@ -0,0 +1,157 @@ +# R0 最小交接合同 + +状态:`R0 SEMANTIC FREEZE · MACHINE FIXTURES PENDING` + +R0 只冻结跨层必须共享的语义,不冻结未来 C ABI、内存布局、RPC、数据库或服务拆分。R1 以后 +只能依赖这些版本化交接面,不能读取上一层私有状态或建立旁路入口。 + +## 1. 合同对象图 + +```text +PrincipalRef + holds +CapabilityRef + constrains +ActionProposal + receives +AuthorizationVerdict + binds +ExecutionAttempt + reports +Observation + is read by +AcceptanceRun + produces +AcceptanceVerdict + EvidenceEnvelope +``` + +对象可以在同一高内聚工程内实现;分层表达所有权和依赖方向,不要求拆成微服务。 + +## 2. 所有合同共有的头部 + +每个跨层对象至少携带: + +```text +schema_version +object_id +subject_id +created_at_or_logical_time +producer_identity +correlation_id +causation_id +content_digest +``` + +R0 fixture 使用规范化 JSON 表达这些语义,便于跨工具检查。该 JSON 不是未来内核 ABI。时间戳 +可以是真实时钟或确定性逻辑时钟,但必须声明来源,不能混用后再排序。 + +## 3. Principal、Object 与 Capability + +`PrincipalRef` 最少区分主体身份、主体类型、authority domain 和代表关系。作者、人类批准、 +模型能力或 Harness 进程身份都不能自动生成执行权。 + +`ObjectRef` 最少区分对象身份、对象类型、authority domain 和期望状态版本。 + +`CapabilityRef` 最少绑定: + +- issuer、holder 与 target object; +- allowlisted action kinds; +- 参数范围与资源上限; +- 生效、过期和撤销状态; +- capability version 与 policy version; +- 委托来源及不扩权证明所需引用; +- 可重放边界和使用次数限制(如适用)。 + +Capability 是授权输入,不是动作已发生或目标已成立的证明。 + +## 4. ActionProposal 与授权裁决 + +`ActionProposal` 最少绑定: + +```text +principal +capability +target_object +expected_state_version +action_kind +bounded_parameters +resource_budget +deadline +policy_version +correlation_id +``` + +`AuthorizationVerdict` 独立记录 `ALLOW | CLAMP | DENY`、Guard 与规则版本、输入摘要、原因、 +最终允许参数及到期点。`CLAMP` 必须生成明确的最终动作,不能让执行器自行猜测裁剪结果。 + +Harness 只能提交 `ActionProposal`。它不能持有 Guard 私钥、authority state 写入口、资源机制 +凭据或特权执行器句柄。绕过 Harness 直接调用下一层时,下一层仍需独立验证自己的合同。 + +## 5. ExecutionAttempt 与 Observation + +执行尝试必须绑定 proposal、authorization verdict、executor、目标状态版本、开始/结束坐标和 +实际动作。Execution 使用独立状态轴: + +```text +SUCCEEDED | FAILED | PARTIAL | UNKNOWN +``` + +`Observation` 最少包含: + +- attempt identity 和观察者; +- pre-state、post-state 或其不可变摘要; +- 实际资源变化与残留状态; +- runtime、kernel、cgroup、process 或 hardware counter 的来源; +- 采样窗口、缺失字段和已知污染; +- rollback/recovery reference; +- 原始 evidence references。 + +执行器不能把自己的 `SUCCEEDED` 提升成 `VERIFIED`。 + +## 6. AcceptanceVerdict 与 EvidenceEnvelope + +Acceptance 只能通过只读事实源或独立 verifier 检查声明。一次 run 的裁决为: + +```text +PASS | FAIL | INCONCLUSIVE | BOUNDARY | PENDING +``` + +`AcceptanceVerdict` 最少绑定 Subject、assertions、固定源码/工件/环境坐标、verifier 和 policy +版本、读取的 evidence references、逐条 assertion 结果、裁决原因及未验证范围。 + +`EvidenceEnvelope` 最少绑定: + +- source commit、toolchain lock、lab profile 与 workload fixture; +- Principal、Capability、Proposal、Authorization、Attempt、Observation 和 Acceptance 坐标; +- 原始记录的位置、摘要、媒体类型和生成者; +- environment、seed、时间来源、资源预算与 stop line; +- 完整性检查结果、缺口、冲突和 known unknowns; +- verifier 输入、输出和退出状态。 + +Evidence 完整或哈希一致不自动证明观察内容真实;验收仍须独立读回。记录缺失、截断、重排、 +冲突或 verifier 越界不能产生 `PASS`。 + +## 7. 三层交接矩阵 + +| 生产方 | 消费方 | 只允许交付 | 禁止交付 | +| --- | --- | --- | --- | +| Agent Harness | Deterministic authority | 版本化 `ActionProposal` 与 Principal 引用 | 凭据、可变 authority state、直接执行句柄 | +| Deterministic authority | Resource mechanism | 已验证且限域的 action command、预算和期限 | 原始 Prompt、模型上下文、未裁决 proposal | +| Resource mechanism | Observation/Acceptance | attempt、原始 observation、恢复引用 | 自封的事实真值或研究结论 | +| Acceptance | Research record | verdict、evidence references、边界与失败分类 | 对被验对象的修复性写入或成功倒灌 | + +同一进程内调用也必须遵守这张矩阵;地址空间相同不代表 authority 相同。 + +## 8. R0 机器夹具门禁 + +本语义冻结不能单独关闭 R0。进入 R1 前必须再提交: + +1. 机器可读、带版本的合同 schema; +2. 每个合同的最小合法、边界合法和非法 fixture; +3. Harness 越权、过期/撤销 Capability、状态版本冲突、预算越界、证据损坏等负例; +4. 一个不依赖被验实现内部状态的 fixture verifier; +5. schema 演进和不兼容变更规则; +6. 固定命令、预期 verdict 和失败输出。 + +如果普通动作必须通过无类型字典、任意指针、隐藏全局变量或共享数据库状态才能完成,合同 +边界视为失败,R0 不关闭。 diff --git a/docs/r0-literature-gate.md b/docs/r0-literature-gate.md index 7935d7b..d06bcc9 100644 --- a/docs/r0-literature-gate.md +++ b/docs/r0-literature-gate.md @@ -48,3 +48,6 @@ R0 仍为 `Planned`。当前单机和硬件条件允许文档、合同、工具 文献基线至此闭环。下一步仍是 R0 的工具链、合同、基线和干净恢复协议,不能越过 R0 去堆 R1–R7 的实现。 + +后续 R0 子门和唯一允许的施工顺序由 +[R0 闭环与 R1 准入门](r0-closure-gate.md)约束。 diff --git a/docs/r0-reference-lab-freeze.md b/docs/r0-reference-lab-freeze.md new file mode 100644 index 0000000..f458cf1 --- /dev/null +++ b/docs/r0-reference-lab-freeze.md @@ -0,0 +1,123 @@ +# R0 Linux Reference Lab 冻结合同 + +状态:`R0 PROTOCOL FROZEN · FIRST EVIDENCE RUN PENDING` + +Linux reference lab 是外部对照、观测实验台和合同夹具,不是 FlowKernel target。它可以帮助 +提前发现生命周期、权限、资源和验收设计错误,但其成功状态不得升级成自研内核证据。 + +## 1. 三条证据线 + +| 证据线 | 最小内容 | R0 可接受结果 | +| --- | --- | --- | +| Traditional Linux | 默认调度、nice/affinity 和 cgroup v2(可用时) | `PASS / FAIL / BOUNDARY` | +| Extensible scheduler | `sched_ext`/`scx` 的固定版本、样例 scheduler 与 fallback | `PASS / FAIL / BOUNDARY` | +| Agentic control plane | SchedCP artifact 的有界审计或复跑 | `PASS / FAIL / BOUNDARY / PENDING` | + +`BOUNDARY` 必须来自真实环境探测,例如宿主内核不支持 `sched_ext`、虚拟化层不暴露所需功能或 +硬件预算不足;它不是省略实验的快捷方式。`PENDING` 必须记录负责人问题、前置条件和下一次 +重验触发器。 + +## 2. 共同 workload fixture + +三条线必须使用同一版本的 workload 描述和资源预算。R0 最小集合包括: + +- CPU-bound:确定性计算循环,记录工作量和进度; +- I/O-bound:固定数据规模和同步策略的读写; +- memory pressure:阶梯式申请、触碰和释放,受宿主 stop line 限制; +- retry:固定失败序列、退避和最大尝试次数; +- long-running:分段进度、checkpoint 候选点和可控终止; +- mixed:至少两类 workload 竞争同一受限资源。 + +每个 fixture 声明 identity、版本、seed、持续时间、并发含义、资源包络、停止条件、进度信号、 +预期退出方式和允许残留。随机扰动必须保存 seed;第一次失败 fixture 不得被成功重跑覆盖。 + +## 3. 共同动作合同 + +R0 lab 只允许有限动作集合,例如: + +```text +SET_CPU_WEIGHT +SET_CPU_QUOTA +SET_MEMORY_HIGH +SET_IO_WEIGHT +PAUSE +RESUME +TERMINATE +RESTORE_BASELINE +``` + +实际可用动作由宿主能力和权限决定。每次动作都必须经过 +[R0 最小交接合同](r0-contract-freeze.md)中的 Principal、Capability、Proposal、Guard verdict、 +ExecutionAttempt、Observation 和 Acceptance 交接;不允许测试脚本绕过 Guard 直接取得更高权限 +后再声称权限边界有效。 + +## 4. 对照与唯一变量 + +每次实验只改变一个控制变量,并至少包含: + +1. 无 Agent、无学习策略的宿主默认基线; +2. 同预算的确定性规则基线; +3. 被研究的 scheduler 或 agentic control-plane 候选(环境允许时)。 + +基线共享 workload、持续时间、预热、采样、资源预算和 stop line。不能让候选策略获得更高 +权限、更宽资源或更长运行时间后再报告收益。 + +## 5. 独立读回 + +动作命令退出为零只说明命令报告成功。Acceptance 必须从动作入口以外的事实源读回: + +- cgroup v2 文件中的实际配置和统计; +- `/proc` 中的进程、调度、内存和 I/O 状态; +- PSI、perf、eBPF 或 hardware counter(可用且已声明时); +- workload 自身的只读进度与 checkpoint 记录; +- 退出码、信号、残留进程、残留 cgroup 和恢复后的最终状态。 + +如果命令结果、内核状态和 workload 观察冲突,Acceptance 必须输出 `INCONCLUSIVE` 或 `FAIL`, +不得选择最有利的数据源。 + +## 6. 安全包络 + +- R0 默认只操作 lab 创建且可枚举的进程、目录和 cgroup; +- 不修改宿主默认 scheduler、系统级网络、登录服务或非 lab workload; +- 需要 root、BPF 或 `sched_ext` 权限的步骤必须单独声明,并提供恢复和残留检查; +- memory、CPU、I/O、进程数、磁盘和运行时间都设置宿主 stop line; +- watchdog、手工终止和恢复基线不依赖 Agent Harness; +- 清理前先保存失败证据,清理后独立检查残留; +- Docker、WSL、虚拟机和原生 Linux 的结果进入不同环境线。 + +## 7. 证据包 + +一次 lab run 至少产生: + +```text +manifest +environment +toolchain lock reference +contract and fixture identities +raw observations +proposal / authorization / execution chain +acceptance verdicts +metrics and summary +failure and recovery record +residual-state check +known boundaries +``` + +具体文件编码在机器夹具实现时冻结,但原始观察、派生摘要和验收 verdict 必须分开。报告图表 +不能替代原始数据。 + +## 8. R0 退出条件 + +Reference lab 子门只有在以下条件满足时关闭: + +- Traditional Linux 基线在固定 Linux 环境完成至少一次干净运行和一次命名失败运行; +- 相同 fixture 在确定性规则基线运行,预算和唯一变量可审查; +- `sched_ext`/`scx` 和 SchedCP 分别得到 `PASS`、`FAIL` 或有环境证据的 `BOUNDARY`; +- Harness 旁路、越权 Proposal、Guard 拒绝、资源耗尽和恢复用例具有独立读回; +- 证据包能在运行进程退出后由非交互 verifier 检查; +- 清理后没有超出声明范围的残留进程、cgroup、挂载或临时文件; +- 从干净克隆可重复建立 lab,不依赖作者记忆或隐藏宿主状态。 + +当前宿主观察见 +[R0 宿主工具盘点:2026-09-03](evidence/r0-host-inventory-2026-09-03.md)。当前尚无可用通用 +Linux 环境,因此本子门仍为 `PENDING`,不得据此进入 R1;后续环境变化只追加新证据记录。 diff --git a/docs/r0-toolchain-freeze.md b/docs/r0-toolchain-freeze.md new file mode 100644 index 0000000..3f76c1b --- /dev/null +++ b/docs/r0-toolchain-freeze.md @@ -0,0 +1,97 @@ +# R0 工具链冻结合同 + +状态:`R0 DESIGN FROZEN · EXECUTABLE LOCK PENDING` + +本文固定 R0 必须锁定的工具角色、平台边界、版本证据和停止条件。它不声称当前机器已经具备 +这些工具,也不授权开始 R1 内核实现。 + +## 1. 四条工具链必须分开 + +| 工具链 | 用途 | 不得证明 | +| --- | --- | --- | +| Repository gate | 检查文档、合同、链接、状态词和仓库卫生 | 内核可启动或 Linux 行为正确 | +| Contract fixture tool | 校验 R0 交换合同及正反例 | C ABI、权限隔离或执行事实 | +| Target build/emulation | 未来构建和启动固定的 freestanding C target | 真实硬件、多核或生产安全 | +| Linux reference lab | 运行传统 Linux、cgroup、`sched_ext`/`scx` 和 agentic 对照 | FlowKernel target 已实现相同能力 | + +四条线可以共享不可变源码坐标和合同版本,不能共享成功状态。任何一条线缺失时,只将对应 +结论标为 `PENDING` 或 `BOUNDARY`,不能借另一条线代替。 + +## 2. R0 首选平台边界 + +- **合同与仓库门禁:** 能运行仓库固定 Node 入口的受支持宿主。 +- **Linux reference lab:** 原生或虚拟化的 x86-64 Linux;必须记录发行版、内核、cgroup + 模式、虚拟化层和可用权限。 +- **FlowKernel target:** x86-64 单核模拟目标;只允许在 R0 锁定的模拟器机器型号、CPU + 模型和启动交接格式上进入 R1。 +- **容器:** 可以提供辅助环境,但不能成为唯一恢复路径,也不能掩盖宿主内核、cgroup 或 + `sched_ext` 的实际能力。 + +R0 必须在第一次 target build 前单独冻结启动交接格式。GRUB/Multiboot、UEFI/OVMF、Limine +或其他方案当前都不是既成事实;在选择及反证完成前,`R1 ENTRY` 保持禁止。 + +## 3. 可接受工具族 + +R0 允许在证据比较后从以下角色中各选一个首选实现,并保留一个可替代性说明: + +| 角色 | 首选候选 | 冻结前必须回答 | +| --- | --- | --- | +| C compiler | Clang/LLVM 或 freestanding GCC cross toolchain | C11 子集、target triple、内建函数和未定义行为策略 | +| Linker | LLD 或 GNU ld | 链接脚本、段布局、入口、重定位和 map 文件 | +| Binary inspection | LLVM tools 或 GNU binutils | ELF header、section、symbol 和反汇编证据 | +| Emulator | QEMU system emulation | machine、CPU、memory、single-core、headless 和退出通道 | +| Host tests | compiler sanitizer + static analysis | 哪些测试只在 hosted build 中成立 | +| Lab observation | `/proc`、cgroup v2、PSI、perf/eBPF where available | 权限、采样污染、缺失指标和读回来源 | + +“系统里能找到某个命令”不等于工具链已冻结。冻结坐标必须进入版本锁文件并经过干净环境重建。 + +## 4. 版本锁的最低内容 + +R0 关闭前必须提交机器可读的 `r0-toolchain-lock`,至少记录: + +- schema version; +- 每个工具的名称、版本、上游下载坐标和内容摘要; +- 宿主 OS、目标 triple、模拟器 machine/CPU 和启动交接格式; +- 完整编译、链接、检查、启动和退出参数; +- 必需环境变量及允许的默认值; +- 可选工具和缺失时的 `BOUNDARY` 行为; +- 许可证与再分发边界; +- 生成该锁的 commit 和验证命令。 + +浮动的 `latest`、未固定的容器标签、只写产品名不写版本、依赖个人 PATH 或 IDE 配置都不能 +通过 R0 工具链门禁。 + +## 5. C 和构建门槛 + +首选工具链无论选用 Clang 还是 GCC,都必须落实现有 +[C-first 内核契约](c-first-kernel-contract.md): + +- freestanding C11 子集; +- warning 作为失败; +- 禁止隐式分配、可变长数组、无界递归和未审计宏技巧; +- hosted sanitizer 测试与 freestanding target build 分开; +- 编译器、链接器、静态分析器和模拟器输出进入不同证据项; +- 汇编文件、链接脚本和 map 文件可枚举并进入来源记录。 + +具体 warning 列表、target flags 和链接参数只能在候选最小程序上验证后写入锁文件,不能从 +另一个操作系统项目复制后直接宣称有效。 + +## 6. 当前证据与规范分离 + +宿主工具可见性属于会变化的 evidence,不能写成稳定工具链规则。本轮只读观察单独保存在 +[R0 宿主工具盘点:2026-09-03](evidence/r0-host-inventory-2026-09-03.md)。它显示 repository gate +可运行,而 target toolchain、Linux reference lab 和干净机器恢复仍为 `PENDING`;该观察不能 +被写成 R0 已关闭。 + +## 7. 冻结与重开 + +工具链子门只有在以下事实同时成立时关闭: + +1. 精确锁文件、下载来源和摘要已提交; +2. 干净环境可以按一个非交互入口恢复工具链; +3. hosted checks、target build、binary inspection 和 emulator smoke test 的证据互相分开; +4. 缺失的 Linux、`sched_ext` 或硬件能力被明确标为 `BOUNDARY`; +5. 首次失败、修复和重验记录均被保留。 + +更换编译器族、target triple、启动交接格式或模拟器机器型号必须重开本子门。补丁版本升级可以 +追加新证据线,但不能覆盖旧锁和旧失败。 diff --git a/scripts/verify-repository.mjs b/scripts/verify-repository.mjs index b89ee0e..acd7b69 100644 --- a/scripts/verify-repository.mjs +++ b/scripts/verify-repository.mjs @@ -23,6 +23,11 @@ const requiredFiles = [ "docs/prior-art-matrix.md", "docs/research-evidence-traceability.md", "docs/r0-literature-gate.md", + "docs/r0-toolchain-freeze.md", + "docs/r0-contract-freeze.md", + "docs/r0-reference-lab-freeze.md", + "docs/r0-closure-gate.md", + "docs/evidence/r0-host-inventory-2026-09-03.md", "docs/threat-model.md", ]; @@ -94,6 +99,10 @@ for (const link of [ "docs/prior-art-matrix.md", "docs/research-evidence-traceability.md", "docs/r0-literature-gate.md", + "docs/r0-toolchain-freeze.md", + "docs/r0-contract-freeze.md", + "docs/r0-reference-lab-freeze.md", + "docs/r0-closure-gate.md", "docs/threat-model.md", ]) { if (!readme.includes(link)) fail(`README.md: navigation is missing ${link}`); @@ -125,6 +134,58 @@ for (const field of [ if (!literatureMatrix.includes(field)) fail(`Prior-art matrix is missing field: ${field}`); } +const r0Closure = fs.readFileSync(path.join(root, "docs/r0-closure-gate.md"), "utf8"); +for (const statement of [ + "R0 PLANNED · CLOSURE WORK ONLY · R1 ENTRY PROHIBITED", + "R0-T 工具链候选验证与精确锁", + "R0-C 机器合同与正反 fixtures", + "R0-LAB reference lab runner", + "→ STOP", +]) { + if (!r0Closure.includes(statement)) fail(`R0 closure gate is missing: ${statement}`); +} + +const r0Toolchain = fs.readFileSync(path.join(root, "docs/r0-toolchain-freeze.md"), "utf8"); +for (const statement of [ + "EXECUTABLE LOCK PENDING", + "target toolchain、Linux reference lab 和干净机器", + "R0 已关闭", +]) { + if (!r0Toolchain.includes(statement)) fail(`R0 toolchain boundary is missing: ${statement}`); +} + +const r0Contract = fs.readFileSync(path.join(root, "docs/r0-contract-freeze.md"), "utf8"); +for (const statement of [ + "ALLOW | CLAMP | DENY", + "SUCCEEDED | FAILED | PARTIAL | UNKNOWN", + "PASS | FAIL | INCONCLUSIVE | BOUNDARY | PENDING", + "不能把自己的 `SUCCEEDED` 提升成 `VERIFIED`", +]) { + if (!r0Contract.includes(statement)) fail(`R0 contract boundary is missing: ${statement}`); +} + +const r0Lab = fs.readFileSync(path.join(root, "docs/r0-reference-lab-freeze.md"), "utf8"); +for (const statement of [ + "不是 FlowKernel target", + "独立读回", + "FIRST EVIDENCE RUN PENDING", + "后续环境变化只追加新证据记录", +]) { + if (!r0Lab.includes(statement)) fail(`R0 reference lab boundary is missing: ${statement}`); +} + +const r0HostInventory = fs.readFileSync( + path.join(root, "docs/evidence/r0-host-inventory-2026-09-03.md"), + "utf8", +); +for (const statement of [ + "OBSERVED · R0 ENVIRONMENT BOUNDARY", + "没有可用的通用 Linux lab", + "本次观察不能关闭 R0", +]) { + if (!r0HostInventory.includes(statement)) fail(`R0 host inventory is missing: ${statement}`); +} + const researchTraceability = fs.readFileSync( path.join(root, "docs/research-evidence-traceability.md"), "utf8",