feat: publish Dever core with project scaffolding and versioned AI skills

This commit is contained in:
Antigravity committed 2026-10-04 13:37:30 +00:00
1 parent 70fa73cdc2
commit ac458ffa7f
960 files changed
+221319 -1163

No files matched your search

@@ -0,0 +1,19 @@
# Bootstrap project guidelines
## Scope
This repository is a Rust workspace for the Dever language compiler, runtime,
CLI and repository-root tests. `AGENTS.md` and the actual implementation are
the source of truth for `.trellis/spec/backend/`. There is no frontend package
or UI source in this repository; frontend scaffolding from `trellis init` is
not applicable and must not prescribe hypothetical conventions.
## Completion
- [x] Document compiler/runtime/CLI ownership and real source examples in
`.trellis/spec/backend/directory-structure.md`.
- [x] Document compiler contracts, ORM, errors, logging, toolchain and focused
checks in `.trellis/spec/backend/`, backed by source and tests.
- [x] Remove unused frontend template specs; no frontend rules are claimed.
- [x] Keep the backend index in sync and verify no template placeholders remain
in applicable backend specs.
@@ -0,0 +1,28 @@
{
"id": "00-bootstrap-guidelines",
"name": "00-bootstrap-guidelines",
"title": "Bootstrap Guidelines",
"description": "Fill in project development guidelines for AI agents",
"status": "completed",
"dev_type": "docs",
"scope": null,
"package": null,
"priority": "P1",
"creator": "Antigravity",
"assignee": "Antigravity",
"createdAt": "2026-09-04",
"completedAt": "2026-09-18",
"branch": null,
"base_branch": null,
"worktree_path": null,
"commit": null,
"pr_url": null,
"subtasks": [],
"children": [],
"parent": null,
"relatedFiles": [
".trellis/spec/backend/"
],
"notes": "Rust compiler workspace; frontend template specs are not applicable.",
"meta": {}
}
@@ -0,0 +1 @@
{"file": ".trellis/spec/backend/quality-guidelines.md", "reason": "Focused checks"}
@@ -0,0 +1,17 @@
# 设计
## 归属与复用
源码格式和 Markdown 内容区间由 core 拥有。使用 CommonMark 解析库识别真实顶层围栏,避免自造解析器误执行列表、HTML 或外层示例内的伪代码。新依赖仅用于编译器,不进入最小运行时。
SourceFile 保留原文,词法 token span 使用原字节位置。Markdown 提取不能让缓存、诊断、运行故障指向合成文件。词法/格式化共用程序区间;语义包路径接受 `.dever.md`,重复检测沿用声明注册。
## 格式化
先解析全包,验证完整声明不跨围栏。复用 AST 格式化方法,按块选择包头/声明/注释生成内容,原位替换内部文本。不能合并代码块或移动说明。CLI 快照检查与 staging 原样复用。
## 分工与契约
主代理负责 CLI 文案、实际 CLI 验证、示例、文档、规范与任务记录。实现代理负责 core/加载/解析/格式化、必要依赖和 core 定向测试。完成后独立审查,主代理复核关键证据。
程序围栏须顶层、闭合,信息字符串为 `dever`;无标记及其他语言只展示。每个类型、函数分句和 package 头完整位于一块内。若不支持缩进围栏,应明确诊断,不静默改变归属。
@@ -0,0 +1 @@
{"file": ".trellis/spec/backend/index.md", "reason": "Compiler conventions"}
@@ -0,0 +1,24 @@
# 执行与验证
用户已在双格式方案后确认并选择 `.dever.md`,无需重复请求实施授权。
- [x] Core:程序块识别、原文位置、加载与包路径、共用解析和格式化。
- [x] 定向测试:提取/拒绝边界、中文换行定位、混用/重复包/契约、格式化保留说明和幂等。
- [x] 示例和 CLI:结算示例、空源码提示、实际 check/fmt/run/build 的隔离定向验证。
- [x] 文档规范:语言说明、实现说明、过时草案、AGENTS 源码规则。
- [x] 检查:相关 Rust 格式、定向 Clippy/Markdown/formatter 测试及独立复核。
`/root/.cargo/bin` 不在 PATH 时只设置命令级 PATH。持久测试放根 `test/`,临时程序归测试所有;无服务或网络操作,无全量/集成测试,无提交。仓库大部分文件原本未跟踪,diff 以本轮前快照为准。
## 完成证据(2026-09-09)
- `cargo test --offline -p dever-tests --test markdown_source --test formatter --test syntax_and_format`:45 项通过(12 + 11 + 22)。主代理已检查原始日志 `/tmp/dever-markdown-checks.log`。
- 同目标 `cargo-clippy clippy --offline ... -- -D warnings` 通过;CLI 单独 `-p dever-cli --bin deverc -- -D warnings` 通过。10 个修改 Rust 文件的定向 rustfmt 检查通过。
- 实际 CLI 对 `examples/markdown` 的 check/fmt/run 通过,输出 `customer = 小明`、`subtotal = 47.5`、`discount = 4.75`、`payable = 42.75`。普通 `.dever` 计价包被 Markdown 包调用。
- 根 test/ 下临时程序验证:无 rustc 时 check 仍可用、两种格式的 API 相同、普通 README 忽略、fmt --check 不写、第二文件错误阻止所有改写、CRLF/说明/围栏保持及幂等、run/build、PATH 不含工具链时独立运行、已有输出不覆盖、重复包 C002、C005 精确到 Markdown 第 11 行第 20 列、运行除零定位 Markdown 第 11 行。临时文件和二进制已清理。
- 最终 core 的实际 CLI 裸 CR/缩进围栏验证通过:中文原文 C005 第 10 行第 31 列、格式化无新增 LF、说明保持、check 和 fmt --check 通过。首次手写列号预期少算一列,按原文核对修正,非实现缺陷。
- 独立只读审查无阻塞。补充验证包头前后独立注释块、跨块 Bool 分句、同一文件各块 LF/CRLF/CR、围栏/正文保持和幂等通过。
- 新编译器依赖 `pulldown-cmark = 0.13.4`(关闭默认特性)及三个传递依赖已获取并锁定;不进入运行时,验证全部离线。复用已有 target/verification-tools 中的 rustfmt/Clippy,未安装全局组件。
- 更新过时标题语法草案、当前说明和旧主任务源码格式限制。28 个实现/文档变更文件空白检查通过;未修改现有无关删除项。
无未解决阻塞。未运行全量、集成或服务测试,未提交 Git;开发工作区改动保留供审查。
@@ -0,0 +1,25 @@
# Dever Markdown 程序源码支持
## 目标与确认决定
用户希望用 Markdown 组织易读的 AI 程序,继续由 Dever 类型与契约约束执行。2026-09-09 用户批准同时保留 `.dever` 和 Markdown 源码,并明确选择 `.dever.md` 后缀。
- `.dever` 行为兼容;`account/user.dever.md` 对应 `account.user` 包。
- 标题、说明、表格不参与程序定义;只有标为 `dever` 的顶层围栏代码块属于程序,按顺序处理。代码保留完整 Dever 包、类型和函数声明。
- 一个文件拥有一个包;格式可跨包混用,同包重复必须报错。
- 复用现有语法、语义、契约、API 与原生编译路径。
- 诊断和运行故障定位到原 `.dever.md` 文件及准确行列。
- `fmt` 只格式化程序代码块,保留其它 Markdown 和围栏;整批检查后逐文件原子写入规则不变。
## 验收
1. 只加载 `.dever`/`.dever.md`,普通 `.md` 中的示例忽略。
2. 同一程序两种格式的执行结果一致;混用包可调用,重复包、类型错误、分句缺失、失败义务仍拒绝。
3. 多代码块、中文、不同换行、注释和原生故障位置正确;普通示例、嵌套围栏、引用、列表与 HTML 内的伪程序不执行。
4. 程序围栏闭合,各块包含完整顶层声明(允许纯注释或空块);无程序块、跨块声明报错,避免格式化移动代码跨说明。
5. 格式化只更新代码块内部、幂等;语法或程序结构错误时无文件改写。
6. 提供可读的结算 Markdown 示例,更新语言说明和过时草案。
## 范围与验证限制
不增加新语言语法、浏览器运行时、编辑器扩展或多语言执行。不改无关文件,不提交或安装全局命令。只跑离线定向检查和自有临时程序,不跑全量、集成测试或现有服务。开发依赖获取明确记录,最终程序编译保持离线。
@@ -0,0 +1,8 @@
# 源码事实
- source.rs 只收集 `.dever`,保存原文、SourceId 和行开始位置;符号链接全部拒绝。
- lib.rs 的 parse_uncached 共用 lexer→parser;lexer 当前读取 SourceFile.text()。
- check.rs 的 check_package 固定 `.dever` 路径;注册阶段已有重复包检测。
- format.rs 从 token 注释和 AST 生成整个包;CLI 先准备全部字符串,再快照核验和逐文件原子替换。
- check/cache.rs 键含源码全文/路径,文档改动仍需重新建立准确诊断位置。
- pulldown-cmark 提供带偏移的块事件:https://docs.rs/pulldown-cmark/0.13.4/pulldown_cmark/struct.Parser.html 。当前未缓存,新增这一个编译器依赖用于避免不完整的 Markdown 自制解析器。
@@ -0,0 +1,26 @@
{
"id": "markdown-source",
"name": "markdown-source",
"title": "Dever Markdown 程序源码支持",
"description": "保留 .dever,新增 .dever.md 源码加载、原文诊断、保留文档的格式化与定向验证",
"status": "completed",
"dev_type": null,
"scope": null,
"package": null,
"priority": "P2",
"creator": "Antigravity",
"assignee": "Antigravity",
"createdAt": "2026-09-09",
"completedAt": "2026-09-09",
"branch": "main",
"base_branch": "main",
"worktree_path": null,
"commit": null,
"pr_url": null,
"subtasks": [],
"children": [],
"parent": null,
"relatedFiles": [],
"notes": "",
"meta": {}
}
@@ -0,0 +1,3 @@
{"file":".trellis/spec/backend/error-handling.md","reason":"检查错误、OOM、计数和进程退出都显式传播"}
{"file":".trellis/spec/backend/quality-guidelines.md","reason":"核对 CPU 隔离、测量矩阵、最小测试和结果边界"}
{"file":".trellis/tasks/09-13-http2-ceiling-soak/research/client-bottleneck.md","reason":"检查实现没有引入重复负载器或错误分位数聚合"}
@@ -0,0 +1,70 @@
# 设计
## 1. 最小改动边界
本阶段只扩展 `test/performance` 的负载进程配置和测量文档。现有 Rust `network_bench` 已具备多线程 runtime、固定 HTTP/2 连接拓扑、速率调度、完整响应校验和延迟直方图,因此不修改 Rust 负载器,更不修改生产运行时。
多进程客户端会产生多组独立直方图。只合并 p99 会得到错误分位数,输出全部 4096 个桶再聚合又会扩大协议和实现范围。一个多线程进程已经能把请求 worker 分布到多个 CPU,同时保留单一调度和精确的进程内直方图,因此采用该方案。
## 2. CPU 与 worker 合同
`Process` 的亲和性参数从单个 `cpu` 改为可空的 `cpus` 集合,并在 fork 后、exec 前一次性调用:
```text
os.sched_setaffinity(0, cpus)
```
服务端仍把 `--server-cpu` 转为单元素集合。运行器将 `--client-cpu` 直接迁移为 `--client-cpus`,接受无重复的逗号分隔非负整数;新增 `--client-workers`,默认 1。运行前集中校验:
- 所有指定 CPU 必须属于当前进程允许集合;
- 服务 CPU 不得出现在客户端 CPU 集合;
- 正式压测显式使用 `--client-workers 4 --client-cpus 1,2,3,4`。
不强制 worker 数等于 CPU 数,避免把合理的欠订阅/超订阅变成运行器错误;报告必须同时记录两者,使结果可解释。HTTP `load()` 和 `live.load_live()` 都把 `BENCH_WORKERS` 设置为同一个 `args.client_workers`,并把同一个 CPU 集合交给 `Process`。
## 3. 数据流与复用
```text
run.py 参数与集中校验
-> Process(cpus=client_cpus)
-> BENCH_WORKERS=client_workers
-> 现有 network_bench 单进程 Tokio runtime
-> 现有 H2 连接/请求槽、调度、校验、Histogram
-> 现有 load JSON、进程采样、case/report 汇总
```
`Process` 继续只负责子进程生命周期、亲和性和采样;它不解释 server/client 角色。`run.py` 负责参数合同与服务/客户端隔离。`live.py` 只消费已经校验的参数,不新增一套 CPU 解析逻辑。
## 4. 测量阶段
所有正式场景只测 Dever,服务绑定 CPU 0、1 worker、1 CPU quota、swap 0;客户端绑定 CPU 1–4、4 workers,位于服务 cgroup 之外。使用现存 `typed-orm-build-v2` 指纹产物和 16 流配置;先验证其 HTTP/2 二进制、TLS 文件和清单,不重建生产产物。
### 饱和扫描
- 预算:128 MiB
- 路径:`/plain`
- 传输:h2c、TLS+h2
- 拓扑:16x16(256 请求槽)
- offered rate:30000、45000、60000、90000 req/s
- 每 case:1 秒预热、5 秒测量、2 个 repeat
若 90000 仍未出现平台,则只报告“扫描上界不足”,不继续无界提高负载。观测平台取成功 QPS 不再随 offered rate 近似线性增长的区间,不把容量丢弃计为服务错误。
### 60 秒稳态
从扫描得到的 h2c/TLS+h2 较低平台值向下取整到不高于 80% 的明确整数 rate,确保两种传输使用相同负载。128 MiB 和 64 MiB 各运行 h2c/TLS+h2 一个 60 秒 case。99% 成功率门槛只用于证明选定 rate 可持续,不用于定义服务极限。
### 连接恢复耐久
128 MiB 下,h2c/TLS+h2 各在同一服务进程运行 100 轮;每轮 16 条物理连接、每连接 16 流、0.1 秒、1000 req/s,随后使用既有 0.3 秒断开观测。每轮校验握手、请求错误和 FD 回落,整组检查 cgroup OOM 与 RSS 序列。
## 5. 风险与解释
- 多线程负载器仍有单一速率调度协程。如果扫描中客户端 CPU 未扩展、dispatch expired 显著而服务端未满 1 核,本阶段应如实判定压测器仍受调度器限制;是否实现分片调度另建任务,不能伪称服务端平台。
- 客户端和服务端仍共享同一虚拟机,只是 CPU 集合隔离;缓存、内存带宽和宿主机噪声仍然共享。
- 64 MiB cgroup 的文件页计费受热缓存影响,继续同时报告进程 RSS/PSS 和 cgroup peak,不以任一单值替代另一个。
- 100 轮是分钟级重复回收证据,不是小时级泄漏或生产网络稳定性证明。
## 6. 回退
改动不涉及生产代码。若 CPU 集合支持造成回归,回退 Python 运行器、测试和文档即可;已有构建产物和历史报告不修改,新测量始终写入新输出目录。
@@ -0,0 +1,3 @@
{"file":".trellis/spec/backend/directory-structure.md","reason":"保持 Python runner、进程采样和 Rust 协议负载的职责边界"}
{"file":".trellis/spec/backend/quality-guidelines.md","reason":"遵守性能测量公平性、资源预算、报告和最小验证要求"}
{"file":".trellis/tasks/09-13-http2-ceiling-soak/research/client-bottleneck.md","reason":"复用已有多线程能力并避免不可合并的多进程分位数"}
@@ -0,0 +1,32 @@
# 执行计划
## 1. 启动与上下文
- [x] 用户确认后运行 `task.py start`;启动前不修改基准源码。
- [x] 使用 `trellis-before-dev` 重新加载 backend 规范,核对当前 diff、磁盘、CPU、cgroup 和正式构建产物;`build-http2-final` 已不在工作树,改用参数满足需求的 `typed-orm-build-v2`,仍须校验指纹。
## 2. 客户端并行配置
- [x] 将 `Process(cpu=...)` 收敛为 `Process(cpus=...)`,所有调用者一次性迁移;保持亲和性只作用于自有子进程。
- [x] 在 `run.py` 增加 CPU 集合解析、集中分配校验、`--client-cpus` 和 `--client-workers`,删除旧 `--client-cpu`。
- [x] 让 HTTP/HTTP2 与 live 客户端共同使用相同 worker 数和 CPU 集合;更新 report environment/arguments。
- [x] 清理重复解析与分支,确保进程生命周期、运行器合同和协议负载职责仍分离。
## 3. 定向验证
- [x] 扩展 `test_runner.py`,覆盖 CPU 集合解析、重复/越界/重叠拒绝、子进程实际亲和性和报告配置。
- [x] Python 语法解析与 runner 34/34 通过;HTTP/2 产物指纹校验通过,未运行全量测试。
- [x] `http2-ceiling-smoke-09-18`:h2c/TLS+h2 各 30/30 成功、16/16 握手、FD 差 0、OOM 0,报告确认 4 workers、CPU 1–4、客户端 5 线程。
## 4. 有界正式测量
- [x] `http2-ceiling-scan-09-18`:128 MiB、16x16、30k/45k/60k/90k、h2c/TLS+h2、5 秒、2 repeats 共 16/16 完成,错误/OOM/FD 差为 0。
- [x] 30k 档 h2c/TLS+h2 吞吐约 29.9k/29.8k;45k 以上 h2c 约 34–40k、TLS+h2 约 37–39k,服务端接近 1 核、客户端 1.4–2.0 核,请求槽丢弃主导,调度过期很少。28k 的 60 秒首轮分别只有 98.68%/97.91% 成功;24k 的 10 秒校准 TLS+h2 只有 99.18%。20k 的 10 秒校准分别为 99.96%/99.92%,据此将正式共同稳态输入定为 20,000 req/s(低于较低观测平台的 80%)。
- [x] `http2-ceiling-steady-128m-20k-09-18` 与 `http2-ceiling-steady-64m-20k-09-18`:h2c/TLS+h2 各 60 秒,成功率依次为 99.77%/99.92% 和 99.94%/99.80%,吞吐约 19.95k–19.99k req/s;全部零错误/OOM、FD 差 0。28k 首轮两项不足 99%,保留该报告为探索证据。
- [x] `http2-ceiling-recovery-09-18`:128 MiB 下 h2c/TLS+h2 各 100/100 轮,分别成功 9,944/10,000 请求,余下 56 次/组为调度过期;每轮至少成功 95/98 个,16 次握手、FD 差 0,请求错误/OOM 为 0。首末轮断开后 RSS 为 4,845,568→5,357,568 B / 5,959,680→6,647,808 B,完整逐轮序列保留。
## 5. 收尾
- [x] 更新 `test/performance/README.md` 与 backend 性能规范中的 CLI、测量结果和限制;HTTP/HTTPS 30/30、TCP/WS/SSE 16/16 最小相邻入口回归通过。
- [x] 检查了入口到子进程的 CPU/worker 传递、重复、职责、命名和无关改动;未改生产运行时或覆盖历史报告,空 frontend 模板是单独已归档的 bootstrap 任务。
- [x] `trellis-check`:runner 定向单测 34/34、Python AST、构建清单指纹、扫描/稳态/恢复报告计数与 OOM/FD/握手不变量、空白检查均通过;HTTP/HTTPS 与 TCP/WS/SSE 最小回归通过。未运行全量测试、Cargo build、rustfmt/clippy;未提交 Git。
@@ -0,0 +1,42 @@
# HTTP/2 饱和边界与耐久压测
## 目标
解除现有 HTTP/2 压测客户端的单核限制,在服务端固定 1 CPU、128 MiB/64 MiB、无 swap 的条件下,测量 Dever HTTP/2 小响应的本机饱和边界、60 秒稳态表现和重复连接恢复表现。结果用于判断后续是否存在值得单独优化的生产热路径,不把本机 loopback 数字外推为跨机器或生产环境上限。
## 已确认事实
- `network_bench` 已使用 Tokio 多线程 runtime,并通过 `BENCH_WORKERS` 控制 worker 数;HTTP/2 请求调度、响应校验、计数守恒和延迟直方图已有单一实现。
- `test/performance/run.py:258` 把负载端 `BENCH_WORKERS` 固定为 1,`test/performance/process.py:104` 只允许子进程绑定一个 CPU。此前 30000 req/s 的 Dever 4x16 场景中,服务端和客户端均约占 0.9 核,因此现有数据不能区分两端上限。
- 已构建清单允许 32 条物理连接、每连接 16 流、任务容量 272;16x16 需要 272 个服务任务,正好落在已有容量内,无需重新配置生产运行时。
- Rust 负载结果只有一个进程内的完整直方图。拆成多个客户端进程后,现有 p50/p95/p99 摘要无法无损合并;使用一个多线程负载进程可以保留现有统计合同。
- 当前机器允许 CPU 0–4;正式测量可将服务绑定 CPU 0,将负载端限制到 CPU 1–4。现有构建产物生命周期为 3600 秒,足以完成单个 60 秒场景和 100 轮恢复场景。
## 需求
- 将基准进程的单 CPU 亲和性扩展为明确的 CPU 集合;服务端继续使用单 CPU,客户端可使用多个互不重复且不与服务 CPU 重叠的 CPU。
- 运行器新增明确的客户端 worker 数和客户端 CPU 集合参数,统一用于 HTTP、HTTP/2 和长连接负载;报告记录实际 worker 数和 CPU 集合。
- 仓库内调用者一次性迁移到新的客户端 CPU 集合参数,不保留旧 `--client-cpu` 别名或兼容分支。
- 多线程客户端继续复用一个 `network_bench` 进程、一套请求调度和一组原始直方图;不新增协议实现,不增加多进程结果拼接器。
- 使用现存 `typed-orm-build-v2` 指纹产物(原 `build-http2-final` 已不在工作树,HTTP/2 配置仍为 32 连接、16 流、272 任务),先对 Dever `/plain`、h2c 和 TLS+h2、16x16 拓扑扫描多个 offered rate,区分客户端限制、请求槽限制和服务端饱和。
- 根据扫描结果选择不高于观测平台 80% 的整数 offered rate,分别完成 h2c 和 TLS+h2 的 60 秒稳态测量;128 MiB 与 64 MiB 服务预算均覆盖,服务 CPU 固定为 1 核,swap 为 0。
- 在同一 Dever 服务进程上对 h2c 和 TLS+h2 分别完成 100 轮 16x16 建连、请求、断开,逐轮保留计数、FD 和 RSS 回落数据。
- 所有正式 case 必须保留请求计数、延迟、服务端/客户端 CPU 与内存、cgroup peak/OOM、握手数和断开后 FD 数据;失败时保留已完成结果与日志。
## 验收标准
- [x] 定向测试证明进程可绑定 CPU 集合,CPU 参数拒绝空值、重复值、越界值以及与服务 CPU 重叠的配置。
- [x] 报告中的 `client_workers` 与 `client_cpus` 等于实际配置;负载进程采样可报告超过单核的总 CPU 使用率,且服务端仍只绑定一个 CPU。
- [x] HTTP/1、HTTP/2 和长连接负载共用同一客户端并行配置入口;现有协议调度、响应校验和直方图实现未复制。
- [x] 16x16 饱和扫描覆盖 h2c/TLS+h2 和至少四个递增 rate;全部请求计数守恒、请求错误为 0、握手数等于物理连接数、无 OOM,报告能识别吞吐平台或确认扫描上界仍不足。
- [x] 128 MiB 与 64 MiB 下各完成 h2c/TLS+h2 的 60 秒稳态 case;请求错误和 OOM 为 0,成功率不低于计划请求的 99%,结束后 FD 回到 READY 基线。
- [x] h2c/TLS+h2 各完成 100 轮 16x16 恢复;每轮至少有成功请求、错误为 0、握手数正确、FD 回到 READY 基线,RSS 序列如实记录且不把短时平台误称为无泄漏证明。
- [x] 文档记录命令、机器约束、扫描结果、稳态/恢复结果和限制;明确区分本机观测饱和点、可持续负载与跨机器性能。
- [x] 只运行受影响的 Python 单元测试、最小 loopback smoke、现有产物指纹校验和显式有界压测;不运行全量测试,不接触已有服务,不提交 Git。
## 排除项
- 修改 `crates/dever-runtime`、编译器、语言 API 或 HTTP/2 生产协议路径。
- 多进程客户端、跨进程直方图合并、新压测依赖或第二套结果格式。
- 跨主机、公网、丢包/限速注入、HTTP/3、RFC 8441 或小时级 soak。
- 预设固定 QPS 门槛、与 Go/Fiber 的跨机器数字比较,或根据一次短测直接修改生产热路径。
@@ -0,0 +1,27 @@
# 客户端瓶颈证据
## 现有实现
- `test/dever-tests/examples/network_bench/load.rs` 从 `BENCH_WORKERS` 创建 Tokio multi-thread runtime,范围为 1–64。HTTP/2 的物理连接、请求 worker、速率调度、响应校验和三组 Histogram 均在该进程内完成。
- `test/performance/run.py` 的 `load()` 无条件写入 `BENCH_WORKERS=1`,并通过 `args.client_cpu` 把负载进程绑定到一个 CPU;`live.py` 使用相同单 worker/单 CPU 方式。
- `test/performance/process.py` 的 `Process` 已集中拥有 fork 后亲和性设置,只需把单元素集合推广为调用方提供的集合,不需要新增进程封装。
## 现有结果
`target/performance/http2-plain-128m/report.json` 中,Dever 4x16、30000 req/s 的三轮结果为:
- h2c 成功 QPS 29506–29804,服务端约 0.87–0.92 CPU,客户端约 0.89–0.91 CPU;
- TLS+h2 成功 QPS 28673–29865,服务端约 0.91–0.93 CPU,客户端约 0.92 CPU;
- 请求错误均为 0,但存在容量丢弃,因此该档位不能确定是哪一端首先饱和。
## 方案比较
| 方案 | 优点 | 问题 | 结论 |
| --- | --- | --- | --- |
| 多进程客户端 | 调度器天然分片,可跨多个 CPU | 每进程独立直方图,现有分位数无法正确合并;还需拆分 rate、连接和生命周期 | 本阶段不采用 |
| 单进程多线程 | 已有 Tokio 支持;保留单一计数、校验和直方图;改动只在 Python 配置 | 单一调度协程仍可能成为更高档位瓶颈 | 先采用并用结果验证 |
| 引入 h2load 等外部工具 | 成熟、高吞吐 | 新依赖、响应合同和报告格式不同,破坏现有可比性 | 不采用 |
## 结论
当前最小实验不是重写负载器,而是解除 Python 对已有多线程能力的限制。只有在多 CPU 客户端仍显示调度端瓶颈时,才有证据支持后续分片调度或多进程直方图协议。
@@ -0,0 +1,26 @@
{
"id": "http2-ceiling-soak",
"name": "http2-ceiling-soak",
"title": "HTTP/2 ceiling and soak",
"description": "解除 HTTP/2 压测客户端单核限制,测量单核小内存服务的饱和边界、稳态表现与连接恢复耐久性。",
"status": "completed",
"dev_type": null,
"scope": "test/performance + performance docs/spec; reuse existing network_bench and production runtime unchanged",
"package": null,
"priority": "P2",
"creator": "Antigravity",
"assignee": "Antigravity",
"createdAt": "2026-09-13",
"completedAt": "2026-09-18",
"branch": "main",
"base_branch": "main",
"worktree_path": null,
"commit": null,
"pr_url": null,
"subtasks": [],
"children": [],
"parent": "09-04-dever-language-mvp",
"relatedFiles": [],
"notes": "",
"meta": {}
}
@@ -0,0 +1,3 @@
{"file":".trellis/spec/backend/quality-guidelines.md","reason":"定向验收与代码审查"}
{"file":".trellis/spec/backend/database-guidelines.md","reason":"配置、Model、事务和迁移不变量"}
{"file":".trellis/spec/backend/compiler-contracts.md","reason":"双源码和错误合同"}
@@ -0,0 +1,26 @@
# 设计边界
- 复用同一 source/parser/check/native 流程;Markdown 只负责抽取及文档合同,不另建 ORM。
- Model 字面量约束收敛在已有 normalize_value 所有者;覆盖 default/seed 两种调用者。
- ORM 错误复用现有 choice/error 隐式失败机制;数据库错误身份不得通过文本猜测,非数据库故障仍走 Fault。
- 标准库 `dever.database.Error` 对应 runtime ErrorKind 的十个 error 分支,每个保留 message。调用方结果类型可用一个 error-only choice 载荷包装原错误,例如 `error Failed(error: dever.database.Error)`;checker/native/reference 共用捕获映射,显式抛出的外层错误仍保留名义身份,重叠包装及不匹配错误集合均拒绝。
- 数据迁移扩展已有命名 migration 与参数化 SQL 校验/运行流程,不新增迁移框架。
- CMS 两套源文件具有相同包名和声明,Markdown 补充所需中文文档;共同测试防漂移。普通 CRUD 直接调用 Model,业务状态校验留在 service。
- CMS 演示管理员 Seed、编辑注册与文章发布;注册规范化邮箱/显示名并检查必填数据,单次 create 不增加空事务包装。发布事务验证作者 Active,再按 slug upsert。入口首次注册编辑、重复运行复用编辑,稳定输出 users=2/news=1;哈希仅为演示值,不实现登录或密码算法。
- 旧 examples/dever/cms 移至 examples/cms/dever;其余 dever/markdown 示例整体放 examples/old 下。更新维护中的路径,历史日志保留事实。
- 基准 Python 驱动按受控测试目录写 config/setting.json,Rust peers 使用统一读取规则;工具链配置不混入业务配置。
- 不触及 HTTP API 设计、路由、认证协议或新增 API 配置。现有编译器 dever.api 合同快照仍是编译器能力,并非用户延期的业务接口。
实现分工:Model/Markdown 与基准配置分别独立处理;主线程负责错误链、迁移、CMS 与集成。相邻文件修改前明确交接。
## 命名数据迁移
`migrate name` 保留 `drop field`,增加可重复的 `before { sqlite = "..."; postgres = "..."; parameters = [...] }` 与 `after { ... }` 块;这里的分号仅表示文档分隔,实际源码使用换行。每块必须显式给出两个方言与参数列表,参数用现有绑定编码,不做字符串插值。
- SQL 只接受一条 INSERT、UPDATE 或 DELETE;扫描器跳过引号/注释后检查首关键字及语句终止符,拒绝多语句、事务控制、DDL、PRAGMA。占位符继续复用现有方言扫描与连续参数覆盖检查。
- `_dever_`、`sqlite_`、`pg_` 前缀及 `information_schema` 是保留对象,普通、引用和 SQLite 单引号名称都不能出现在迁移 SQL 中;同名业务文本使用绑定参数。PostgreSQL Unicode 转义标识符不接受,防止绕开保留名称检查。
- 无类型上下文的绑定常量支持 Bool、Int、Text、null 和指数形式 Float;无指数小数属于 Decimal,缺少目标精度/scale 时拒绝,不隐式改为 Float。
- 已有表先校验已应用迁移与实际 catalog,再按源码中迁移/块的顺序执行全部未应用 before,执行自动结构变更,再执行全部未应用 after,最后 Seed/history。所有步骤在现有单 Model 迁移事务中完成;失败整体回滚。
- 新表直接建立最终结构和 Seed,登记迁移已应用,不重放旧数据转换。无 SQL 的 drop-only revision 保持原算法;包含 SQL 的 revision 纳入名字、drop、方言文本、参数类型/值、phase 与块顺序,以有边界的规范表示计算,避免拼接歧义。修改或删除已应用迁移继续拒绝。
- 运行语句放 `Model.data_migrations`,历史 Schema 仍保存声明名、revision、drop;复用 `orm::Value` 和数据库绑定,不新增通用值系统。
- 事务边界是同一数据库中的单 Model 初始化;跨表变换只能引用届时已存在的表。编译器现有 Model 初始化顺序不变,不承诺跨 Model 原子升级、任意对象拓扑或跨数据库迁移。
@@ -0,0 +1,3 @@
{"file":".trellis/spec/backend/quality-guidelines.md","reason":"定向离线验证及测试目录"}
{"file":".trellis/spec/backend/database-guidelines.md","reason":"Model、事务、配置与迁移合同"}
{"file":".trellis/spec/backend/compiler-contracts.md","reason":"源码格式、错误和效应一致性"}
@@ -0,0 +1,38 @@
# 执行记录
用户已授权实施;API 明确延期。沿用上一轮审查已验证的缺口。
## 顺序
- [x] Model 字面量与 Markdown 声明合同、对应定向测试。
- [x] 基准配置迁移到 config/setting.json,Python/Rust 定向检查。
- [x] ORM 恢复错误的类型/效应/生成器贯通及事务捕获回归。
- [x] 命名数据迁移扩展及历史/事务定向回归。
- [x] examples 重排、CMS 双源码业务实现、路径与文档同步。
- [x] 双源码 check/run/build 与打包定向验证、独立审查、规范更新。
## 验证边界
仅当前合同及示例的离线定向测试。SQLite 数据库使用测试临时目录。若需要 loopback 短时 peer 验证,运行前说明;不连接外部数据库、不运行全量集成或压力测试。未安装的 lint 工具如实记录。
## 当前证据
- Model default/Seed 定向 3/3;Markdown 静态/格式化 18/18(包括新 Model 声明支持)。
- 基准 runner 37/37;network/live 无网络配置测试 2/2;Rust peers offline check/build 通过。现有根 setting.json 未修改。构建产物协议标记 setting-json-v1,旧产物必须重建。
- error_effects 原有 8 项通过;新增共享错误包装/native+reference 1 项通过(含显式外层错误身份保持)。
- SQLite 共享 ORM fixture 通过;新增 NotFound/Constraint 经任务和事务回滚捕获通过,最终记录 0 条。
- 所有迁移后示例统一合同检查通过。两套 CMS 声明、Model、API、配置 parity 通过。
- CMS 实际 native 首次运行发现 first() 行解码裸块的 ?/return 错误边界问题,已在共用 decode_included_row 修复;关联查询 native 回归 1/1,通过。
- CMS CLI/打包验收 1/1(392.43 秒):两格式各 check、2 次 CLI run、build、2 次无 module 独立打包运行,均 users=2/news=1。业务 probe 确认邮箱/显示名规范化,重复注册 Constraint 后数据不增加,禁用作者后发布 AuthorDisabled 且文章不增加。临时项目和 SQLite 已清理。
- 两套 CMS 经 deverc fmt 整理后,fmt --check 和 parity 再次通过。CMS 基准 fixture 与当前业务入口的静态检查 1/1;旧 system 示例移除配置环境变量后的 native 检查 1/1。
- 命名数据迁移 7/7(包括真实 native 双版本 SQLite 升级);既有 orm_migration 7/7;最后增加 dollar-quote 回归后,静态/SQLite 7/7、共享 typed SQL 3/3 通过。native 升级未因纯扫描器边界修正重复运行。
- 默认 core 及 core + PostgreSQL runtime cargo check 通过;最终扫描器修正后再次通过。
- 独立审查确认 1 项 P2:PostgreSQL SQL 以未闭合 $tag 结束时,then_some 急切切片越界。最小回归先复现 panic,再修正共用扫描器;未闭合 delimiter/body 均给出 C014,合法 Unicode tag 和含 $ 的标识符保留。修复已独立复核,无剩余阻塞。
- rustfmt/clippy 未安装。性能没有重测,旧 CMS 报告对应旧业务入口,不能替代新实现验收。
## 收口
- examples 仅保留 cms、old 两个目录:cms/dever 与 cms/md 同步;历史示例位于 old/dever、old/markdown。正式测试仍在 test/。
- README、LANGUAGE、MARKDOWN-SYNTAX、示例说明和 backend specs 已同步。维护中的路径及配置环境变量搜索无旧入口;历史任务/日志保留原始事实。
- 本次验收完成。业务 HTTP API 等用户重新设计;真实 PostgreSQL、性能/体积/64/128 MiB 压测不属于本轮验收。命名迁移只保证单 Model 事务,不承诺跨 Model 原子升级。
- 本地任务未关联 PR;按项目要求不创建 commit,归档和日志均使用 no-commit。
@@ -0,0 +1,18 @@
# 双源码 CMS 与语言合同修正
## 需求
用户要求 examples 最终只有 cms、old 两个目录;cms/md 与 cms/dever 同步实现同一 CMS,旧示例移到 old。API 留待用户重新设计,本任务不实现 HTTP API。
承接源码审查:修复 Markdown Model 识别/声明合同、Model 默认值与 Seed 字面量校验、ORM 可恢复错误传播与捕获;补齐命名迁移的数据变换能力;示例与基准配置统一从 config/setting.json 读取;同步过期的语言返回值说明。
## 验收
- 两套 CMS 执行相同的注册、发布业务,数据库结构和可观察结果等价;重复执行可预测,禁用作者不能发布。
- 所有旧示例移动到 examples/old;正式测试留在 test;当前代码与文档没有悬空路径。
- Markdown Model 支持普通 Model 的声明,仍执行文档合同校验。
- 不合法 Int/Float/Decimal/Text 默认值与 Seed 在编译期拒绝,不推迟到 Rust 编译或生成器 panic。
- ORM 故障保留错误类别,进入既有隐式失败传播与 result 捕获合同;事务边界不抹掉错误。
- 命名迁移支持参数化、按数据库方言选择的数据变换;事务、历史一致性约束不降级。
- 无应用/基准配置环境变量入口;保留构建工具自身环境及通用 process.environment 语言能力。
- 定向离线检查与最小测试通过,明确未运行的验证。不做全量测试或性能重测,不改全局工具、不提交 Git。
@@ -0,0 +1,26 @@
{
"id": "cms-dual-source-contracts",
"name": "cms-dual-source-contracts",
"title": "双源码 CMS 与语言合同修正",
"description": "CMS 的 Dever/Markdown 双实现、旧示例归档和已确认语言合同问题;API 延后",
"status": "completed",
"dev_type": null,
"scope": null,
"package": null,
"priority": "P2",
"creator": "Antigravity",
"assignee": "Antigravity",
"createdAt": "2026-09-18",
"completedAt": "2026-09-18",
"branch": "main",
"base_branch": "main",
"worktree_path": null,
"commit": null,
"pr_url": null,
"subtasks": [],
"children": [],
"parent": "09-04-dever-language-mvp",
"relatedFiles": [],
"notes": "",
"meta": {}
}
@@ -0,0 +1,3 @@
{"file":".trellis/spec/backend/quality-guidelines.md","reason":"Focused CMS/compiler/runtime verification"}
{"file":".trellis/spec/backend/directory-structure.md","reason":"No junk layers and dual-source ownership"}
{"file":".trellis/spec/backend/error-handling.md","reason":"Business/API/Job failure flow review"}
@@ -0,0 +1,24 @@
# CMS 业务闭环设计
## 复用与依赖
保留路径角色、生成入口与核心 RBAC。认证走配置站点/account.verify,权限目录自动生成,不新增身份注入。跨领域只调用 App。
依赖单向:content.revision、publishing.schedule 调用 news.article;news.article 可依赖 content.category、media.asset、audit.operation,不反向调用 revision/schedule。修订拥有编辑编排,文章拥有作者、状态和版本规则。普通 CRUD 保留生成 REST。
## 数据与行为
文章增加可空分类/媒体引用及受保护版本;关联校验复用叶领域 App。修订调用文章受约束更新再保存快照,复用同一租户事务;使用现有条件 update 的 affected rows 判断竞争,不用 count+1 分配版本。
手动与定时发布共用内聚实现;手动重复保持冲突,任务在已完成状态幂等成功。定时创建验证真实作者,保存必要业务引用并使用 enqueue_at。Worker 仍由核心重新验证可信身份和权限,payload 不能成为认证来源。
API/Job 保持薄适配。数据库回滚不等于任意文件回滚;区分 Upload 临时资源与已提交存储文件。
## 测试分层
- 应用源码测试验证 App/Domain 和正常存储结果,用例由运行器隔离;错误、权限和会话失效通过真实 HTTP 验证。Test/Job 不能调用身份 getter,不增加后门。
- 自有 HTTP 验收使用复制的 CMS、临时 SQLite/配置、随机 loopback 端口、真实登录与角色及正常 Worker。
- 复用 test/performance/cms.py 客户端与现有过程 owner;业务验收留在根 test/,不启动压测。
- 等价检查覆盖声明、Model/API/Job/Port 和设置,Markdown 保留真实文档合同。
## 变更边界
主要修改 examples/cms 双源码与测试、根 test/ 相关验收和 examples/README.md;复用编译器/runtime,默认不重建发行包或升级依赖。
改前备份:target/cms-workflows-before.v1FzWO/source.tar.gz。
## 已证实的核心阻塞
- SQL 返回同领域 App View,复用既有行解码;拒绝非存储类型、private 字段和未经解码证明的字段 bounds。仅两个方言均为完整单表简单投影时证明只读,其他 SQL 保持 write 效果。
- 可信用户/租户 ID 可在明确 nullable ModelId 上下文中保持名义类型,API 与 REST 均按当前 Provider 的 verify 字段验证,不把 Int 任意转换成 ID。CMS 直接读取已验证身份,避免租户写入链重读全局 Session;保留跨库事务禁止规则。
@@ -0,0 +1,4 @@
{"file":".trellis/spec/backend/compiler-contracts.md","reason":"Final application role/API/Job/visibility contract"}
{"file":".trellis/spec/backend/database-guidelines.md","reason":"CMS Models, transactions, migrations and test isolation"}
{"file":".trellis/spec/backend/logging-guidelines.md","reason":"Audit and secret-free request logging"}
{"file":".trellis/spec/backend/toolchain-and-library.md","reason":"Runtime modes, Port/Job/API standard packages"}
@@ -0,0 +1,40 @@
# CMS 业务闭环实施记录
## 2026-10-04 基线
用户批准本轮实施。旧勾选不代表当前业务验收完成:每套45个生产文件/12领域,3个应用测试中2个固定字符串断言;cms_acceptance只比较API/Model。定时发布用了enqueue而不是enqueue_at,修订版本用count+1。此前真实PG/RBAC/租户和核心Job验收有效,但不代替CMS业务用例。
## 执行顺序
- [x] 更新要求/设计/上下文,保存改前备份。
- [x] 分类/媒体关联、文章版本竞争、修订事务。
- [x] 到期入队、共享发布和任务幂等。
- [x] 替换空测试、同步Markdown、完善等价与CLI预期。
- [x] 有界HTTP验收:身份权限、编辑冲突、上传、到期/重试/回滚。
- [x] 两套check/fmt/test、相关Rust/Python检查和真实验收。
- [x] 独立复核,修复阻塞,更新示例与记录。
## 验证约束
磁盘约462MiB空闲,复用target/debug/dever和runtime pack,Cargo单并发。自有HTTP/Worker前说明;不连真实数据库,不运行全量测试/压测,不变更全局命令/服务。配置只在自有临时项目写config/setting.json;子进程有超时与清理,分别记录通过/失败/未运行。
## 结果
本轮业务闭环已完成。真实HTTP、CLI、核心约束回归、独立复核和静态质量门均通过;未执行范围外的全量CI、真实PG或压测,不将当前结果当作这些验证的替代。所有改动保留在工作区,未创建Git提交。
## 已完成的定向证据与直接阻塞
- 两套源改为46个生产文件+5个真实应用测试;51对源码声明一致,check/fmt及各5/5应用测试已通过。源测试验证正常业务输出,拒绝和失效放在真实HTTP验证,不伪造认证上下文。
- Python CMS调用迁移单测12/12;SQL View/字段范围/跨域约束4/4;API声明与GET只读SQL规则18/18;CMS语义/配置/测试等价2/2通过。
- HTTP第1轮在build发现published_detail误删既有业务校验,已恢复;第2轮构建成功,但bootstrap启动拒绝global Session读取与tenant Article写入同一事务。日志保存在target/cms-business-acceptance-{1,2}/,尚未进入HTTP业务断言。
- 直接语言修复:SQL可返回同领域App View,普通SQL结果record拒绝未经数据库解码证明的bounds;仅完整自有表简单投影可证明只读,两方言都通过才允许GET,其他SQL保留write效果。复用现有类型/行解码/事务,不增依赖和运行时ABI。
- 已修可信身份的名义ModelId取值,以已验证的auth metadata替代业务重复读取global Session;不放宽跨库事务,不将模型ID改成Int。
- 第3轮真实HTTP/Worker验收10组全部通过,report在target/cms-business-acceptance-3/report.json:真实登录/角色拒绝、上传清理、关联/非作者/过期版本、修订晚失败回滚、两请求单胜者、发布快照与晚失败回滚、未来到期/同刻任务、完成任务重放、失败重试、撤权阻断任务、会话注销/过期与站点隔离。fixture程序8,465,384 bytes,临时配置/DB和进程已清理;非压测。
- 独立审查确证REST字段create/replace也可产生typed身份getter,原新增validator只遍历显式API;现已用同一IdentityContext校验API、REST create/replace/search与名义ID owner。新增正反例、跨站点provider错配、native/LLVM生成验证。完整API目标26/26通过,原错误fixture被CLI明确C006拒绝后已清理。普通Int和nullable边界保留。
- 最终源码等价2/2、typed_sql 4/4、Python CMS调用单测12/12。CLI精确用例2/2:双格式各5个应用测试各运行两次(故意阻断部署DB,证明测试隔离),check/run/build及无源码打包运行;混合6用例验证仅数据库用例初始化临时DB。更新了该混合用例残留的旧3测试预期。
- HTTP最终运行器显式关闭SQLite连接;复用已构建程序复验10组全部通过,最终报告target/cms-business-acceptance-final/report.json。不改源码/部署配置,不遗留HTTP/Worker/测试进程。此结果不覆盖真实PG、浏览器HTTPS或性能/长压测。
- 两套最终check/fmt通过,check各有7条W001未读取返回值提示,非错误;语言只允许零输出调用作为动作语句,未用虚假读取或抑制消除提示。Rust改动文件rustfmt --check通过。
- 定向clippy通过(dever-core/dever-tests/dever-cli,lib、dever bin及api_declarations/orm_native_sql/contract_execution/cms_acceptance/cms_project,sqlite feature,-D warnings)。最终diff检查通过。独立复核指出的SQL bounds和REST身份绑定缺口均修复并保留回归;主线程确认实际测试输出。任务直接在既有main工作区完成、没有PR分支,归档使用skip-branch-validation且no-commit。
- 磁盘紧张时暂移的可再生成target/native-artifacts已压缩为target/cms-workflows-before.v1FzWO/native-artifacts-cache.tar.xz(约190MiB)。先逐文件比较,再验证重压缩前后tar SHA256一致(675338b0d4af58b76689ae3ec9bc2c7202a1b5aa3e3f117d0df5930f7e88a7d0);原路径恢复普通空缓存目录,软链和自有内存盘临时副本均已清理。源码、数据库和其他服务未动。
## Bug Analysis: SQL投影与业务集成边界
1. 根因:跨层合同与测试覆盖缺口。私有Model不能穿越App边界,但SQL结果又只能是Model内部record;查询不能直接返回已定义的App View。数据库decoder也不会证明源级bounds。
2. 失败尝试:只开放同域私有record引用仍会触发公开App签名约束;把Session重新读进文章调用链则实际触发跨库事务限制。不能通过放宽隐私或事务检查解决。
3. 防止复发:共享SQL result检查同时验证归属、字段类型/可见性和bounds;GET效果采用完整受限语法证明,保留反例;HTTP按正常入口启动、验证完整提交与回滚。
4. 扩展核对:双源码、旧CMS性能/PG调用方及CLI测试预期同步迁移;原SQL私有record同样拒绝未证明bounds。
5. 已更新backend/database-guidelines.md和LANGUAGE.md;本仓库无对应spec模板副本,不创建;按用户约束不提交Git。
@@ -0,0 +1,25 @@
# 双源码 CMS 业务闭环验收
## 当前目标与授权
2026-10-04 用户批准继续完善 CMS:替换空断言,贯通分类、文章、修订、媒体和定时发布,验证权限拒绝、并发冲突、重试与回滚。沿用本任务;旧规划中的手写 main、Principal 入参、业务 RBAC 和旧命令名已被后续语言合同取代,不恢复旧实现。
## 要求
- 两套示例保持业务声明、Model/API/Job/Port 和测试等价。
- 复用现有 ORM、自动权限、database-only 租户、Upload/Storage Port 和延时 Job;业务规则留在 App/Domain,不绕过真实身份。
- 分类与媒体可关联文章,创建/编辑时校验。修订快照与文章更新同租户事务;过期版本或并发竞争明确冲突,不丢失更新。
- 手动发布保持作者校验;定时创建验证作者和文章状态,按真实到期时间执行;重复任务不重复发布/审计,失败不留下部分完成状态。
- 普通应用测试只用运行器临时 SQLite、结果捕获和 fake,不加身份后门、不读部署配置。认证、租户、上传与 Worker 由自有 HTTP 验收覆盖。
- 两个固定字符串断言必须删除或改为真实业务测试;check、健康接口、快照不代表业务验收。
- 配置只用 config/setting.json,不增加环境变量、权限表或框架层。
## 验收
- [x] 两套 check/fmt、应用测试和语义等价通过。
- [x] 分类/媒体关联、修订编辑、发布快照形成完整链路。
- [x] 未授权/非作者请求失败且无写入,保留即时撤权。
- [x] 并发/过期修订只有合法更新成功;失败回滚文章和修订/审计。
- [x] 任务不提前运行,到期发布、重复执行、失败回滚/重试有真实断言。
- [x] 上传成功与受限/失败路径验证文件、临时资源归属。
- [x] 定向 build、自有临时 HTTP/Worker 验收通过,记录范围和限制。
## 范围外
前端、富文本/搜索产品、外部云服务、公开发行、ARM、全量 CI 和长压测。仅确证阻止本任务的缺陷才修改语言核心。
@@ -0,0 +1,26 @@
{
"id": "large-cms-acceptance",
"name": "large-cms-acceptance",
"title": "Dever 大型双源码 CMS 验收",
"description": "扩展 Dever 与 Markdown CMS,验证大型项目的安全、Port、Job、API 和测试合同",
"status": "completed",
"dev_type": null,
"scope": null,
"package": null,
"priority": "P1",
"creator": "Antigravity",
"assignee": "Antigravity",
"createdAt": "2026-09-20",
"completedAt": "2026-10-04",
"branch": "main",
"base_branch": "main",
"worktree_path": null,
"commit": null,
"pr_url": null,
"subtasks": [],
"children": [],
"parent": "09-20-production-application-language",
"relatedFiles": [],
"notes": "",
"meta": {}
}
@@ -0,0 +1,3 @@
{"file":".trellis/spec/backend/quality-guidelines.md","reason":"定向验证、真实执行和资源所有权"}
{"file":".trellis/spec/backend/compiler-contracts.md","reason":"命令合同不得扩散到API和Worker"}
{"file":".trellis/spec/backend/toolchain-and-library.md","reason":"打包闭包与沙箱完整性"}
@@ -0,0 +1,36 @@
# 普通二进制调用设计
## 源码合同
Adapter:`external command "bin/tool" { allow file }`,路径沿用领域相对资源路径,allow 沿用现有能力名。不接受 setting/lib;部署配置和授权沿用已有 adapter 节点。
每个 command Adapter 对应一个只有一个操作的 Port,操作名按业务自定:`execute(args: List<Text>, stdin: Bytes?) (output: dever.process.Output) fails dever.process.Error`。第二个 stdin 参数允许整项省略(仅 args),传 null 表示立即关闭 stdin。固定字段名防止增加映射 DSL。标准 Output 是 `{code: Int, stdout: Bytes, stderr: Bytes}`;标准 Error 是 `error Failed(message: Text)`,满足现有 Port failure 合同。命令非零退出按沙箱传播的退出码返回,不猜测 signal;启动/超时/超限继续作为源位置 runtime fault。
## 编译器与进程边界
新增 ExternalEcosystem::Command,保留现有 external 合成函数、Port fake、effect 和 suspends 链路。共享 wire 增加仅 Command policy 可用的 Bytes/base64;API/Job/真实 Worker 原有 wire policy 不变。两个后端仍用同一 external start/call/reply ABI,只给 Bytes wire 增加最小桥接函数。
HIR 共用合同构造实现,但 external_worker_contracts 只返回 exec/pip/npm/go,external_command_contracts 返回 command,避免 Lib lock/resolver 散落 command 特判。command 不需要 dever.lock;有真实生态依赖的同项目仍保持原 lock 行为。
## 运行时
复用 invocation Session、Managed、registry、bounded requests 和 structured Scope。command supervisor 启动不执行二进制或协议握手;收到每个请求才启动一个独立沙箱进程,并发写 stdin、读 stdout/stderr 和等待退出。不追加 --dever-component,不重放命令。超时、调用取消和关闭均 kill/wait,再返回结果;空闲 supervisor 可继续服务后续请求,不为正常多次调用套用 Worker crash restart 次数。
复用 verified extraction、launch manifest owner 和 sandbox Launch。内部资源 argv 继续映射,动态调用 argv 作为普通数据追加,不当宿主路径重写。保留只读程序树、grant、namespace/seccomp 与空环境。沙箱 PID namespace 负责后代收束,测试必须观察真实后代清理。
限额来自 config/setting.json 的 `adapter.<port>.command`:timeout_ms(默认30000,最大3600000)、output_limit(默认1048576,最大8388608,两路输出合计)。argv 总量最多65536字节,stdin最多8388608字节;拒绝NUL。base64膨胀及JSON包装不得超过已有16MiB wire上限。Worker Adapter 不使用这组命令限额。
## 离线打包
CLI 专门 command packager 接受一个 ELF 文件及同目录 lib/ 中的普通库文件;只采集所属项目/Package 的显式资源,不扫描宿主或调用 ldd。静态 ELF 可直接运行。动态 ELF 复用签名 sandbox GNU loader/OS库,递归解析 DT_NEEDED、验证目标、SONAME和版本需求,私有库按随附 lib/ 查找,缺少依赖构建期报错。共享已有 Python native ELF 闭包校验算法,不复制第三套解析器。使用固定私有 loader 参数关闭系统 cache,库搜索受打包树与sandbox库限制。
资源沿用SHA、私有原子提取、缓存/签名和Package归属验证;每次启动重新校验。具体 launch manifest 字段按既有owner扩展,不能从运行配置接受任意可执行路径。
## 改动边界
- core syntax/parser/check/ports/hir/wire/native/llvm,library/dever/process.dever,以及 wire runtime/bridge:一条类型与调用合同。
- runtime component/command/external/config 与 sandbox:一次调用的进程和资源生命周期。
- CLI workers command/ELF依赖、libs资源准备:离线可执行资源闭包。
- 根test、LANGUAGE/README和已有规范:真实证据和可用示例。
不增加通用执行注册中心、新依赖、第二套SDK/JSON引擎,不改CMS业务。回滚按上述拥有者整体撤销本任务差异,保留开始前源码备份与用户已有改动。
@@ -0,0 +1,4 @@
{"file":".trellis/spec/backend/index.md","reason":"Rust语言仓库开发边界"}
{"file":".trellis/spec/backend/compiler-contracts.md","reason":"Port/Adapter和两后端的类型与失败合同"}
{"file":".trellis/spec/backend/toolchain-and-library.md","reason":"外部资源、沙箱、目标与生命周期"}
{"file":".trellis/spec/backend/error-handling.md","reason":"源位置错误和资源清理"}
@@ -0,0 +1,56 @@
# 实施与验证
## 执行顺序
1. [x] 读取规范、调查编译/运行/沙箱/打包,固定用户已确认范围和合同。
2. [x] 备份当前源码;并行实施编译器合同及runtime进程执行,主线程实现CLI资源打包。
3. [x] 串行运行必要offline Cargo检查和定向测试;修复真实失败。
4. [x] 用独立ELF与真实Dever源码验证check/run/build、移除源码运行、动态库、取消和完整性;验证ARM目标。
5. [x] 独立Trellis复核、清理本任务冗余、更新语言规范及验证证据,归档;不提交Git。
## 所有权
- 编译代理:core、library/dever/process.dever、runtime/wire.rs、bridge ffi/runtime.h、对应编译/codec测试。
- runtime代理:runtime component/command/external/config、sandbox及进程测试,不改wire.rs和CLI。
- 主代理:CLI workers/libs/ELF闭包/Package必要集成及测试、任务/文档、全部Cargo和重资源验证。
代理不并行运行Cargo,不覆盖其他代理或用户改动。涉及共同合同先沟通。
## 验证原则
仅本任务所需定向检查,无全量测试/业务服务/长测;提前说明自有沙箱进程测试。先check与轻量测试,后更新实际runtime ABI再运行真实源码,不能用旧archive验证新codec。开始可用磁盘约3.3GiB,复用现有目标目录,串行构建。
预期目标:port_adapter、command专用runtime/CLI测试、external_workers/resources、llvm_external_source中command案例;原Worker回归按实际共享代码影响选择。fmt/clippy只覆盖改动所属目标。错误、跳过和未运行独立记录。
## 最终证据
- 改动前备份:`target/external-command-before.lBL9wU/source.tar.gz`。
- CLI/core/runtime 初次 offline check 已通过;command 编译/codec/format/fake 5项通过。
- external_workers 当前13项通过,10项需特定资产的旧真实生态测试未运行。command 打包4项通过,后续新增越界 RPATH 回归需复验。
- runtime 首轮3过5失败为未优化debug哈希耗时超过fixture启动等待;作者构建为sha2/miniz_oxide/flate2指定opt-level=3,测试等待与命令deadline分离。随后即时文件锁断言揭示真实namespace清理竞态:管道EOF早于内核后代回收。最终改为info-fd + block-fd门禁,在放行guard前pin namespace pidfd并核验PPid,取消等待pidfd readiness后回收wrapper。9/9定向测试通过(17.86s),包括启动错误、无FD泄露、非零1/127、输入输出、限额、取消/超时/root close/queued/explicit shutdown。
- 独立复核发现启动失败与非零退出混淆、RPATH越出程序树两项问题;已修复,复核确认无剩余阻塞。新增RPATH回归4/4及共用Python ELF闭包2/2通过。
- 旧 Port 原生测试先因测试作者 rustc 路径缺失中断;指定作者工具路径后相关测试运行,期间新增sandbox直接依赖导致 --locked 拒绝。Cargo offline check已增量更新锁,不升级第三方包;最终21/21复验已关闭这些失败。
- 新runtime ABI archive已离线重建(runtime-api/external/sqlite/postgres,3m25s),真实LLVM/CLI验收使用该新档案;未连接任何数据库。改动Rust格式检查及C fixture语法检查通过。
- LLVM command对象+真实调用2/2通过(102.33s);六目标对象生成,预热+64轮每轮3次普通程序调用,二进制/EOF/退出7和allocation ledger全通过。初次60s fixture预算仅完成42轮,给command probe单独180s预算后保留全部65轮与相同断言;原Worker预算不变。
- native_runtime_link 的Bytes wire C ABI验收1/1通过(7.18s)。
- signed_cli_runs_and_packages_ordinary_command_with_private_library 1/1通过(172.02s):当前核心和新ABI、真实C动态工具+私有.so、check/run/build、无Lib锁、Package锁定资源、删除项目/作者/机器目录后两种产物独立运行、篡改.so拒绝。所有daemon/程序均为自有临时fixture,未安装全局命令。
- 最终旧Worker生命周期1/1、external_resources 8/8通过;1项旧Rust bootstrap打包用例维持ignored,本次已有新的真实LLVM/签名CLI独立打包证据。
- 最终Port/Adapter(包含普通/fake实际原生执行)21/21通过(103.41s),此前作者路径/锁文件导致的失败已全部关闭。
- Linux ARM64 runtime-api/runtime-external桥接库、runtime、sandbox/guard 交叉cargo check通过(65s);结合六目标LLVM对象生成与CLI跨目标打包/拒绝错架构验证。未重发四个ARM发行profile、未运行ARM实机/虚拟机验收,不能将这些检查表述为ARM执行通过。
- 所有改动所属库、guard及6个相关测试target的clippy `-D warnings`通过(45.21s);Rust定向fmt和C语法检查通过。git diff --check通过但本仓库核心文件为untracked,实际差异还通过改动前tar对比、逐文件检查与独立复核覆盖。
## 最终检查入口
Cargo均为offline、单并发,不使用全量测试。作者工具路径仅影响构建/验证进程,未加入应用环境配置。作者测试使用`profile.dev.package.{sha2,miniz_oxide,flate2}.opt-level=3`减少大量重复资源校验耗时。
- `dever-tests --features external --test port_adapter`:21通过。
- `dever-tests --features external --test external_command`:9通过。
- `dever-tests --features external --test external_component --test external_resources`:1+8通过,1旧bootstrap用例ignored。
- `dever-cli --test external_workers`:13通过、10个旧真实生态fixture ignored;最终command过滤4通过。
- `dever-cli --test external_libs wheel_tests::native_`:2通过。
- `dever-backend-bridge --features embedded,runtime-external --test llvm_external_source command_ -- --include-ignored`:2通过。
- `dever-backend-bridge --features embedded,runtime-external --test native_runtime_link wire_codecs_validate_slots_before_callback_and_release_partial_values -- --ignored --exact`:1通过。
- `dever-cli --test native_release signed_cli_runs_and_packages_ordinary_command_with_private_library -- --ignored`:1通过。
- ARM交叉check使用现有`target/arm64-cross`作者sysroot/工具,profile runtime-pack,target aarch64-unknown-linux-gnu;检查sandbox和bridge runtime-api/runtime-external。
未运行:全量测试、长压测、真实数据库、ARM目标执行及Windows;未替换全局安装或修改主机策略。当前无已知本任务阻塞。原有两篇tracked文档删除及其他既存任务保持原状。
@@ -0,0 +1,33 @@
# Linux 普通二进制调用
## Goal
在 Port/Adapter 下直接执行现成 Linux 二进制,支持参数、标准输入输出、退出状态、超时取消及独立打包
## 已确认范围
用户已在上一轮审阅普通命令调用、Port/Adapter、参数数组、可选标准输入、两路输出、退出码、超时取消、二进制与动态库打包、Linux x86_64/ARM64、无 shell/env 的方案,并批准创建任务、规划和实施。本任务不再次请求相同授权。
## 需求
- R1:直接调用现成 Linux ELF,无需程序实现 Dever 协议或用户编写其他语言包装;Port/Adapter 保留唯一外部调用边界。
- R2:参数按数组原样传递,标准输入可省略;输出不丢失非 UTF-8 字节,正常非零退出码属于结果。
- R3:启动失败、超时、取消、输出超限明确处理;每次调用均回收自有进程及沙箱后代,不自动重试命令。
- R4:run/build 离线准备并嵌入程序和显式随附的必要动态库;检查目标架构、依赖闭包和完整性,部署不依赖源码/机器缓存/宿主语言工具。
- R5:继续使用 config/setting.json 管理部署文件授权和调用限额,不添加环境变量或 PATH/shell 查找。复用现有沙箱,不修改宿主策略。
- R6:保持现有 exec/pip/npm/go Worker 合同;普通 Dever 测试继续 Port fake,不执行真实命令。兼容 Package 资源与 Markdown 源码。
## 验收
- [x] 编译检查并格式化合法 command Adapter;拒绝错误 Port 签名、额外操作、setting/lib 和非法路径;其他 wire 边界仍拒绝 Bytes。
- [x] 真实无协议 ELF 收到空格、引号、shell 元字符和绝对沙箱路径原文;stdin EOF、二进制输入输出、两路并发大输出、正常非零退出正确。
- [x] 超时/调用取消/根关闭/输出超限均有界完成并回收沙箱进程树;后续调用仍可执行,无自动重放。
- [x] 打包拒绝错架构、缺库、错误 SONAME/ABI、越界路径和篡改;完整动态程序在移除原始源码后运行。
- [x] 真实 Dever check/run/build 和独立产物覆盖完整路径;Package 资源与现有 Worker 定向回归通过。
- [x] Linux ARM64 构建与目标校验覆盖;目标运行证据单独报告,不能由 ELF 标签推导运行通过。
ARM64本次证据为Rust交叉检查、LLVM目标对象生成及打包目标校验;实际普通命令与独立产物运行证据来自Linux x86_64。完整验证命令、失败修复及未运行项见implement.md。
## 非目标
Windows/macOS、FFI、shell/管道语法、后台守护进程/交互式终端、隐式下载或宿主库扫描、全量测试和长压测。
@@ -0,0 +1,26 @@
{
"id": "external-command",
"name": "external-command",
"title": "Linux 普通二进制调用",
"description": "在 Port/Adapter 下直接执行现成 Linux 二进制,支持参数、标准输入输出、退出状态、超时取消及独立打包",
"status": "completed",
"dev_type": null,
"scope": "external-command",
"package": null,
"priority": "P2",
"creator": "Antigravity",
"assignee": "Antigravity",
"createdAt": "2026-10-04",
"completedAt": "2026-10-04",
"branch": "main",
"base_branch": "main",
"worktree_path": null,
"commit": null,
"pr_url": null,
"subtasks": [],
"children": [],
"parent": null,
"relatedFiles": [],
"notes": "Linux普通二进制调用已实现并完成定向及真实打包验收;ARM证据为交叉检查/对象生成/目标校验,不含目标执行。备份与完整证据见implement.md。不提交Git、不替换全局安装。",
"meta": {}
}
@@ -0,0 +1,2 @@
{"file":".trellis/spec/backend/toolchain-and-library.md","reason":"目标贯穿、共享缓存、安全闭包、Worker部署一致性"}
{"file":".trellis/spec/backend/quality-guidelines.md","reason":"真实跨目标执行证据与最小回归边界"}
@@ -0,0 +1,25 @@
# Linux ARM64 应用交叉构建设计
## 边界与复用
只有应用部署目标变化,编译器/daemon/build tools 仍在当前 x86 宿主运行。复用 LLVM bridge 的 Target、现有 pack 清单/签名验证、NativeProgram 发布、Lib resolver/lock/Worker 以及 CacheStore,不建立平行流水线。主机平台身份继续用于 launcher/daemon 验证;新增独立、封闭的构建目标值,不能全局替换 platform_identity。
## 目标数据流
CLI build 参数 → 明确的 BuildTarget → 目标 Lib 资源准备 → CompileRequest → daemon 验证目标 pack 与缓存 → worker 加载目标 runtime → LLVM object/LLD → 独立程序。私有编译走同一目标与 pack owner。run/test 在入口固定使用 host;应用配置不保存编译器状态。
toolchain/target.rs 拥有 BuildTarget(LinuxX86_64、LinuxAarch64),严格解析 linux-x86_64/linux-aarch64,提供 host/platform/triple 映射。共享库不引用 bridge,避免 launcher/deverd 引入 LLVM。原始六目标 bridge 保持独立。
每个 runtime/<target>/manifest.json 验证实际目标与 compiler_version/ABI;所选目标的整个输入闭包必须纳入安装签名,缓存键包含目标和该 pack 身份。pack 制作器接受显式准备的目标运行输入,同时只验证/打包 x86 宿主核心,不要求构建 ARM 核心。
## Lib 与宿主执行
资源路径、runtime/构建收据和 ELF 校验使用部署目标;实际启动的编译工具使用构建宿主。Go 交叉编译工具必须在 x86 执行且输出 ARM,标准库/importcfg 和源码 tags 选择 ARM。Python wheel 与 npm addon 遵守目标 ABI;跨目标源码构建不能把 ARM 工具直接作为 x86 可执行文件启动,也不能无条件接受宿主生成的收据。共用现有显式 Lib 准备入口传递目标,离线 build 只消费完整、已校验的目标材料。lock 模式如需变化直接迁移仓库合同/fixture,不增加旧格式回退。
源项目与 Dever Package 的业务声明不增加架构分支。只有明确的部署目标选择和作者工具输入区分架构。缺少目标资产给出明确准备错误,不能退回宿主资源或无沙箱执行。
## 验证与运维
作者资源/模拟器解包到本任务专用目录,使用绝对工具路径与校验摘要,不全局安装。所有 Cargo/原生构建由主代理串行执行,优先复用现有缓存,开工前检查磁盘与内存预算。跨编译测试验证 ELF、执行结果及坏输入拒绝;共享编译验证目标隔离和命中前完整性校验。模拟 ARM 内核只在任务自有进程/镜像内运行,不修改主机 AppArmor 或已有服务。
ARM 真机吞吐和不同硬件/内核兼容性不从模拟结果推导。本次不重新跑既有全量矩阵或长压测。
@@ -0,0 +1,4 @@
{"file":".trellis/spec/backend/directory-structure.md","reason":"编译/运行库/Lib/资源的唯一owner和根test归属"}
{"file":".trellis/spec/backend/error-handling.md","reason":"显式目标错误与资源/发布清理"}
{"file":".trellis/spec/backend/quality-guidelines.md","reason":"离线定向验证和资源预算"}
{"file":".trellis/spec/backend/toolchain-and-library.md","reason":"运行输入、签名闭包、daemon/cache与生态宿主/目标合同"}
@@ -0,0 +1,61 @@
# 执行记录
## 已确认范围
用户已批准 x86 构建 ARM 应用及创建任务继续实施。最终方案沿用已确认目标,没有 ARM 开发工具链/公开发行/长压测。旧生产化父任务的其他平台延期范围,仅为本任务的 Linux ARM 应用部署这一项解除延期。
## 收口结果
本任务范围全部通过。最终汇总为 `target/arm64-cross/acceptance.json`,逐项绑定构建日志、运行日志和当前产物SHA。最终完整ARM内核模拟日志为 `target/arm64-cross/logs/guest-1791082810005965465.log`:Python、JavaScript、Go各自成功/故障/恢复/清理全部通过,HTTP返回`arm-http`,guest退出0,222.57s,无超时。四profile、私有/共享编译、缓存隔离/篡改拒绝和SQLite真实CRUD由此前独立验收覆盖。
本机构建、41项初始定向回归、Lib 73项、Worker 9项、迁移后的真实Go构建运行1项、Python/JavaScript SDK合同、作者Python输入2项及相关Clippy/格式检查通过;这些测试集有交集,不相加成独立总数。最新Python签名构建201.28s通过,包已包含最终reader及completion清理修复。
没有ARM真机;未运行ARM真机性能/长测、真实PostgreSQL服务器或全工作区CI。模拟器验证功能,不推导真机吞吐。Python sdist/npm hook跨目标仍需事先准备匹配目标的输出和完整收据;纯Python/npm与Go交叉构建已实际覆盖。产品仍不隐式联网或从环境变量/PATH读取语言工具。未安装/替换全局命令、修改主机AppArmor/sysctl或业务服务,未提交Git。
## 实施
1. [x] 调查 CLI、runtime pack、daemon/cache、Lib/Worker 目标链路,建立可审查任务。
2. [x] 编译链路:BuildTarget、build 参数、CompileRequest、runtime/签名/缓存及打包者,配套回归。
3. [x] Lib 链路:显式目标准备、lock/resource/runtime/Worker/build pack 的宿主与目标分离,错架构拒绝与回归。
4. [x] 准备可复现 ARM 运行输入与模拟器;构建四 runtime profile 和所需生态资源。
5. [x] 串行定向检查,执行 ARM 真实应用/三生态模拟验收及 x86 最小回归。
6. [x] 独立复核、修复实际问题,更新规范/CLI 文档/执行证据,清理自有进程与临时配置,不提交。
## 所有权
- 编译实施代理:CLI main/compile/worker、toolchain target/runtime_pack/compilation/service/release/cache、packaging.rs 主文件与编译相关根 test。
- Lib 实施代理:libs.rs 与 libs/**、workers.rs 与 workers/**、packages 的传递 Lib 必需接线、packaging/{ecosystems,builds,sandbox}.rs、生态相关根 test。CLI 参数集成通过主代理/编译代理协调,禁止重写对方文件。
- 主代理:任务/规范/SDK/README、作者 ARM 资源和模拟验收 owner、所有 Cargo 和重资源命令、最终集成。
## 检查原则
先参数/目标映射/清单/缓存/锁的定向测试,再用真实 ARM 产物执行。编译命令明确 offline/locked 和单作业;不让子代理并行 Cargo。真实业务服务仅在自有临时项目/端口或模拟机里启动,提前说明。失败保存证据,不放宽断言、不能将未准备目标或模拟器缺失标成通过。
初始磁盘可用约8.2GiB;现有 debug 3.1GiB、参考 runtime 948MiB 均保留。准备资源前重新核算,不删除用户不明文件、不恢复旧长测。
## 过程与证据(按执行顺序保留)
- 编译与 Lib 两条接线已实施,新增 BuildTarget、请求/缓存目标绑定、显式目标 Lib 准备及 ELF/Go archive 检查;尚待 Cargo 与真实产物验收,未将代理报告记成通过。
- 作者工具均在 `target/arm64-cross/`:Rust 1.98 ARM std、GCC 13 ARM cross、QEMU user/system、同版本私有 rustfmt/clippy。未安装全局工具。Ubuntu 包按现有受信 metadata 的 SHA256 验证,ARM OS 库索引另外通过 Ubuntu InRelease 签名验证。
- ARM base 和 sqlite 已使用 `runtime-pack` 串行构建成功,保存到 `archives/`;postgres/both 仍在构建。初次失败是私有 cross as 找不到同目录 libopcodes,已仅在作者 Cargo 子进程设置私有库路径修复,未加入产品环境变量。
- Python 3.12.14 ARM standalone 和 Node 24.15.0 ARM 已按上游发布摘要下载并生成目标 pack;真实 six/is-number 包及 Google UUID 现有官方校验证据供后续 Worker 验收。
- Alpine 3.22.6 ARM 内核完整系统模拟启动成功,日志 `target/arm64-cross/logs/guest-1791077299508695065.log`:`aarch64`、user namespace 存在、`DEVER_ARM_GUEST_EXIT=0`。这只是模拟机准备,不是 Dever/Worker 验收。
- author native release helper 增加目标参数复用现有 Python/npm选取/manifest;Go author fixture通过私有 Go overlay 固定交叉工具默认目标(源码未改全局SDK),待实际构建与执行。
- 四份 ARM runtime 全部通过:base 311.91s/81,418,028B、sqlite 362.84s/96,034,088B、postgres 338.03s/102,287,968B、both 237.84s/109,661,934B。总作者构建20m52s,峰值1.9GiB、无swap/OOM;每份SHA和命令在对应log JSON。`target/debug/runtime/linux-aarch64`已按真实输入准备,未改原x86 pack。
- 新host工具构建通过;定向测试39项通过:CLI参数3、native maker24、请求目标2、LLVM CLI5、共享缓存1、resolver目标1、exec架构1、managed runtime目标2。未执行的ignored项未算通过。作者Python输入测试2项通过。
- `trellis-check`独立复核修复1处多余借用,17个生产Rust文件格式检查通过;未发现目标数据流/签名/缓存的功能性阻塞。主代理继续负责实际测试,不以复核替代执行。
- 实际签名安装/shared+private ARM构建验收1/1通过(177.32s):4共享profile + 私有base均在删除源码与机器目录后由QEMU执行成功;SQLite真实CRUD、ARM/x86缓存隔离、重复命中、命中前篡改拒绝通过。结果 `target/arm64-cross/compile-acceptance.json`,HTTP应用已导出但尚待完整guest运行。未运行真实PG服务器。
- ARM guard已按私有sysroot成功链接,sandbox OS assets准备完成;前两次作者链接失败(缺libgcc_s、GNU脚本绝对sysroot)均保留日志,修复只在私有作者输入/链接参数,不改变产品配置。Go交叉pack正在构建。
- Go交叉pack已成功(144.86s);签名安装后的三生态ARM应用离线构建1/1通过(453.51s),各应用导出后删除源码和机器目录。完整guest运行尚未通过,构建成功不算Worker执行成功。
- 完整模拟定位两个独立问题:fixture直接从initramfs rootfs运行导致bwrap `pivot_root: EINVAL`,已改为switch_root到正常tmpfs根;随后日志 `guest-1791080132703634001.log`明确显示ARM loader为0600,guard启动Permission denied。
- 根因属隐含宿主假设/跨层传播与测试缺口:`asset_executable`只识别宿主loader,ELF架构校验正确但打包和嵌入权限错误;首轮复核未覆盖这条权限数据流。已在共享owner精确识别两种目标loader,并增加真实pack权限回归(输入0600→loader/guard/bwrap0755、库0644)和负例。目标架构校验、guard和沙箱策略未放宽;规范已补齐。主代理正在重建host工具及全部三生态产物复验,旧产物不能作为修复证据。
- loader修复后host工具重建通过,定向测试41/41通过(原39项加sandbox默认2项);三生态应用重新生成通过(461.13s,日志 `ecosystems-1791080644145693595.log`)。旧失败应用保存在 `target/arm64-cross/failed-loader-mode/`,当前guest/apps均是修复后产物。
- 完整系统验收脚本固化在根test下 `test/ecosystem-release/arm64/{simulate.py,init.sh,bootstrap.sh,guest.sh}`;独立复核补上源码定位的预期错误、每次调用后 `/worker/*` 进程检查、流水线子进程回收,语法检查通过。完整guest正在运行。
- 四ARM静态runtime/guard沿用前述已验证构建:本次最后修复的`asset_executable`仅由宿主作者/CLI打包与嵌入路径调用,ARM运行期不调用它;重新构建host core并重生成应用资源标记即覆盖实际修复,不重复20分钟runtime构建。
- `guest-1791081118958747964.log`已得到Python `data:true`,随后Worker以134退出,验收正确判失败。宿主SDK合同用例保持stdin打开后稳定复现 `_enter_buffered_busy`:daemon读线程持有BufferedReader锁,之前测试先关stdin掩盖了退出竞争。SDK已改用asyncio管道与有界队列,finally取消并等待reader、关闭transport;修改后的整个Python SDK握手/调用/业务错误/取消/关闭/拒绝检查通过。只需重嵌入Python SDK,ARM runtime/Node/Go源字节未变;共用原签名构建fixture增加Python定向入口,不复制构建流程。
- SDK复核补齐有界队列中completion通知任务的取消/等待,`test/external-sdk/check.py`新增Python队列满时关闭、保留stdin等待退出且stderr为空的回归。Python完整合同与JavaScript原合同检查均通过。该保留stdin回归针对CPython退出竞争;JavaScript继续遵循原测试/真实host在shutdown应答后关闭stdin的流程。
- `guest-1791081776953594061.log`完整通过Python成功/故障/恢复/清理,但整个三生态模拟在180s总上限时被停止,记为未通过。模拟器需反复读取校验大型独立程序,后续有限总预算改为600s并增加每步marker;这是9次调用加HTTP的功能验收,不是长压测。
- 旧host Go fixture缺少新增的`build.host`,已校验原SHA及358个leaf,保留工具/stdlib原字节和mode,仅重封装descriptor并同步6个作者文件、锁及prepared摘要;原文件完整备份在 `target/arm64-cross/host-go/backup`。新固定SHA `8818a1eccb510948a55f63088c01678391a5e0c2236e6eacadfe45d0a5edbb43`,prepare.py和SDK文档同步,未改其他语言收据和UUID/sumdb。实际host Go重复编译/移除源码后运行回归1/1通过(18.06s)。
- 静态检查修复沙箱条件嵌套、Go编译参数过多(组合现有构建输入)、共享ELF测试fixture在两个新消费者中的未用辅助方法告警;CLI相关bin/test及sandbox全部target的Clippy `-D warnings`通过。受影响Lib默认73/73、Worker默认9/9通过;各10项ignored未算通过。最后改动Rust格式检查通过,作者Python输入2/2通过。
@@ -0,0 +1,33 @@
# Linux ARM64 应用交叉构建
## 目标
在现有 Linux x86_64 开发机执行 Dever build,得到能在 Linux ARM64 独立运行的应用。部署端不安装 Dever 编译器、Rust、Cargo 或 LLVM。用户已确认上述范围及创建任务、继续实施;不重复要求实施确认。
## 实施前基线
- LLVM bridge 已有 LinuxAarch64 对象生成和链接;CLI compile.rs、toolchain/runtime_pack.rs 仍按 host 选 pack。
- toolchain/compilation.rs 的请求未携带产物目标;service/compile.rs 的缓存目标固定为 host。
- libs.rs、workers.rs 与 Go/build pack 的验证多处把运行目标视为开发机;不能仅改最终主程序而混入 x86 资源。
- 启动本任务时没有 ARM 真机及模拟器。准备作者工具与 ARM 资源属于本任务,模拟通过不等于真机性能验收。
## 要求
1. `dever build <root> --target linux-aarch64 --output <new-file>` 选择产物目标;省略目标保持本机构建。run/test 继续本机执行,未知/重复参数明确失败。
2. 私有 CLI 与机器共享编译均传递同一目标;验证正确版本、ABI、目标 pack 和签名闭包,缓存按目标隔离。不能用宿主 pack 替代缺失 ARM pack。
3. 制作并验证 ARM64 的 base/sqlite/postgres/both 运行库及必要 CRT/静态库;构建端保持 x86_64。
4. Lib 准备/锁定/离线打包区分构建宿主与部署目标,Python/Node 解释器、Go/exec Worker、原生扩展和沙箱资产不得混入错误架构。复用原协议、resolver 和资源 owner,不另建跨编译框架。
5. 产品配置只用 config/setting.json;run/build 不联网、不读取环境变量或系统 PATH 获取语言工具。准备目标依赖必须显式进行。
6. 用模拟环境运行生成的真实应用与目标 Worker,验证输出、失败和清理;涉及 namespace/seccomp 的验收使用带 ARM 内核的完整系统模拟,不能拿用户态模拟结果替代沙箱证据。
## 验收
- [x] 默认本机 check/run/build 行为及参数拒绝定向回归通过。
- [x] x86 构建的应用 ELF 标记 AArch64,模拟器中执行实际 CMD/HTTP/数据库路径并得到预期输出。
- [x] 四 profile 都使用真实 ARM 输入;私有与共享构建命中正确目标缓存,缺失/错误/篡改目标输入均拒绝。
- [x] pip/npm/go 与 exec 的目标资源选择、锁定和错架构拒绝有回归;准备的 ARM 三生态应用能在模拟环境独立运行。
- [x] 产物不依赖 ARM 编译器或源项目,构建不隐式联网;最终日志明确记录通过、未运行和阻塞。
## 不在范围
ARM 上开发/编译 Dever、macOS/Windows、公开发行/新签名体系、真机性能及长压测。保留现有 x86 验收证据,不重复全量 CI;不改宿主 AppArmor、业务服务或全局工具。
@@ -0,0 +1,26 @@
{
"id": "linux-arm64-cross-build",
"name": "linux-arm64-cross-build",
"title": "Linux ARM64 应用交叉构建",
"description": "在Linux x86_64开发机生成可在Linux ARM64运行的应用二进制,覆盖目标运行库、Lib资源、共享缓存和模拟验收;不移植ARM开发工具链。",
"status": "completed",
"dev_type": null,
"scope": null,
"package": null,
"priority": "P2",
"creator": "Antigravity",
"assignee": "Antigravity",
"createdAt": "2026-10-04",
"completedAt": "2026-10-04",
"branch": "main",
"base_branch": "main",
"worktree_path": null,
"commit": null,
"pr_url": null,
"subtasks": [],
"children": [],
"parent": null,
"relatedFiles": [],
"notes": "",
"meta": {}
}