feat: publish Dever core with project scaffolding and versioned AI skills
This commit is contained in:
1 parent
70fa73cdc2
commit
ac458ffa7f
960 files changed
+221319
-1163
No files matched your search
@@ -0,0 +1,3 @@
|
||||
{"file":".trellis/spec/backend/quality-guidelines.md","reason":"Focused compiler/runtime test selection"}
|
||||
{"file":".trellis/spec/backend/error-handling.md","reason":"Typed crypto failure and diagnostic rules"}
|
||||
{"file":".trellis/spec/backend/directory-structure.md","reason":"Single owner across checker, emitter and runtime"}
|
||||
@@ -0,0 +1,29 @@
|
||||
# Dever 安全数据合同设计
|
||||
|
||||
## Model Privacy
|
||||
|
||||
复用现有字段 `private` 语法,不增加 Model 专用修饰符。类型检查为字段记录声明 owner 的 domain identity:普通 record private 继续 package-owned,Model private 改为 domain-App-owned。Model 生成 CRUD 的匿名 create/update block允许所属 App 写 private 字段,但投影、记录构造和公开边界仍由统一字段访问检查控制。
|
||||
|
||||
App 是跨领域能力边界,因此任何直接或嵌套包含 private Model 字段的 nominal record 都不能出现在 App 参数、输出或可传播错误中。Model ID 和不含 private 字段的显式 View 仍可公开。API/Job/wire 检查复用同一 `observable` 类型属性,不再各自遍历字段猜测。
|
||||
|
||||
## Secret Type
|
||||
|
||||
Secret 是独立非泛型标量,内部持有受保护字节,不实现普通 Render/Clone-to-Text/JSON。值语义允许受控传参和 record 字段,但以下静态能力为 false:comparable、Map key、persistent、ordinary wire output、fault rendering。
|
||||
|
||||
构造来源:
|
||||
|
||||
- `dever.crypto.token(bytes)`;
|
||||
- 后续 typed setting/API Secret 字段解码;
|
||||
- 必要的测试固定 Secret 构造仅存在于 compiler-owned Test source,不进入生产标准库。
|
||||
|
||||
消费 sink 由 Intrinsic 精确枚举,不能通过一个通用 reveal 函数扩散。后续 API/Adapter 新 sink 必须在 checker effect/role policy 中显式加入。
|
||||
|
||||
## Crypto Runtime
|
||||
|
||||
使用固定版本的成熟 Rust crates 实现 Argon2id、HMAC/SHA-256 与 constant-time 比较;随机源复用 OS getrandom。Argon2id 参数是经过测试的运行时常量,避免应用通过 setting 降低成本。hash 输出为标准 PHC Text,verify 对格式错误返回显式失败而非 panic。
|
||||
|
||||
标准 `.dever` package 定义公开 Result choice 和简单函数;runtime 只承载密码学实现。checker 校验官方 choice shape,native emitter 复用现有 resource-result 模式,不创建第二套失败协议。
|
||||
|
||||
## Environment Removal
|
||||
|
||||
从官方 `dever.process`、Intrinsic、checker effect、native emitter 和 runtime system bridge 同步删除 environment。仓库调用方整体迁移到 setting.json 或测试显式输入,不添加 feature flag 或旧名兼容。
|
||||
@@ -0,0 +1,4 @@
|
||||
{"file":".trellis/spec/backend/compiler-contracts.md","reason":"Private fields, public boundaries and type properties"}
|
||||
{"file":".trellis/spec/backend/database-guidelines.md","reason":"Model field schema and generated CRUD ownership"}
|
||||
{"file":".trellis/spec/backend/toolchain-and-library.md","reason":"Official package and intrinsic implementation rules"}
|
||||
{"file":".trellis/spec/backend/logging-guidelines.md","reason":"Secret-free render and log requirements"}
|
||||
@@ -0,0 +1,71 @@
|
||||
# Dever 安全数据合同实施计划
|
||||
|
||||
## Start Gate
|
||||
|
||||
- [x] 用户批准父任务最终规划后启动本子任务。
|
||||
- [x] 读取 compiler-contracts、database、logging、toolchain/library specs。
|
||||
- [x] 记录当前 private 字段、Model field access、Render/JSON/log 和 process intrinsic 所有调用点,见 research/secure-contracts-source-map.md。
|
||||
|
||||
## Implementation
|
||||
|
||||
- [x] 扩展类型属性和字段访问 owner,允许 Model private 并限制为所属 App。
|
||||
- [x] 在现有 App/API/入口/错误/测试边界复用 observable 检查;Job 的消费检查由 durable-jobs 子任务接入相同属性。
|
||||
- [x] 增加 Secret 类型、语法类型解析、HIR/native/reference 表示和禁止能力。
|
||||
- [x] 增加 crypto 官方 package、Intrinsic、runtime 实现和依赖;保证失败类型化与错误脱敏。
|
||||
- [x] 删除 environment 官方函数、Intrinsic/runtime 分支、effect 分类、文档与调用方。
|
||||
- [x] CMS 账户使用 private password_hash: Text(255),AccountView/ArticleView 隐藏私有值及作者关联;两套源码同步,没有新增登录 API。
|
||||
- [x] 更新 LANGUAGE/Markdown/compiler/database/logging canonical docs。
|
||||
|
||||
## Focused Verification
|
||||
|
||||
```bash
|
||||
cargo check --offline -p dever-core -p dever-runtime -p dever-cli
|
||||
cargo test --offline -p dever-tests --test model_syntax
|
||||
cargo test --offline -p dever-tests --test source_visibility
|
||||
cargo test --offline -p dever-tests --test contract_semantics
|
||||
cargo test --offline -p dever-tests --test standard_library
|
||||
cargo test --offline -p dever-tests --test logging
|
||||
cargo test --offline -p dever-tests --test markdown_source
|
||||
git diff --check
|
||||
```
|
||||
|
||||
如组件存在,增加受影响 package/target 的 rustfmt 和 `clippy -D warnings`。不运行全量测试、真实数据库、服务或性能测试。
|
||||
|
||||
## Review Risks
|
||||
|
||||
- private Model 字段不能破坏生成 SQL 列顺序、迁移 fingerprint 或 row decode。
|
||||
- Secret 不得因派生 Render/Debug、错误路径或 generic collection 自动获得观察能力。
|
||||
- crypto 失败不得包含输入;随机源和 password verify 不得 panic。
|
||||
- 删除 environment 后必须穷尽 checker/emitter/reference/effect match,不能留不可达旧分支。
|
||||
|
||||
## Implementation Notes — 2026-09-20
|
||||
|
||||
- Secret 位于基础 runtime/secret.rs,Clone 保持值语义、Debug 固定脱敏、zeroize 清除已持有字节;argon2/sha2/hmac/getrandom/subtle 由独立 crypto feature 控制。原生构建根据已裁剪代码中的 crypto 调用选特性,也覆盖直接 system intrinsic。
|
||||
- Model 私有字段访问统一经过 Context::owns_private_fields。类型安全属性缓存沿 Related 关联图做单调反向传播,不把 ORM 关联环当成布局递归。
|
||||
- Argon2 0.5.3 官方文档核对后采用 Argon2id v19 / Params::default;verify 在计算前限制 PHC 算法、版本、成本及结果长度。执行一次 cargo fetch,锁定 12 个新增依赖包;zeroize 复用已存在的 1.9.0。
|
||||
- `secure_contracts` 新定向目标 8/8 通过(含 reference、原生与 Test source 执行)。覆盖隐私所有权/Model schema 不变、嵌套非观察边界、Related 自环、环境入口拒绝、密码错误/损坏/资源上限、SHA/HMAC 已知向量、token 独立性及脱敏 Debug。
|
||||
- 编译检查 core/runtime/cli + crypto/reference 通过。首次验证因磁盘只剩 65 MiB 导致 source_visibility 链接 Bus error,随后 rlib 报 No space left on device;主会话清理 target/debug/incremental 后恢复验证。后续使用 `--config build.incremental=false --config profile.dev.debug=0 --config profile.test.debug=0`,始终 offline + locked,原生测试串行。
|
||||
- rustfmt/clippy 组件未安装;没有安装全局工具。没有运行全量测试、真实 PostgreSQL、持久服务、CMS 打包运行或性能测试;OS 随机源不可用分支未做系统故障注入。
|
||||
- contract_semantics 完整目标初次 6/12:6 个旧样例直接构造 error variant,在既有 `construct_variant_with_kind` 禁令处收到 C005;本次没有改该 error 构造语义,也未重写这些旧样例。最终报告保留未通过,不据此宣称全目标成功。
|
||||
|
||||
## Verification Results
|
||||
|
||||
| 定向验证 | 结果 |
|
||||
| --- | --- |
|
||||
| cargo check:core/runtime/cli + crypto/reference | 通过 |
|
||||
| secure_contracts(crypto,reference,串行) | 8/8 通过 |
|
||||
| model_syntax | 3/3 通过 |
|
||||
| source_architecture | 8/8 通过 |
|
||||
| source_visibility | 10/10 通过 |
|
||||
| markdown_source | 20/20 通过 |
|
||||
| standard_library | 5/5 通过 |
|
||||
| logging | 1/1 通过 |
|
||||
| differential::time_failures_are_source_defined_results | 1/1 通过;移除 environment 样例后保留显式 result 的时间失败 native/reference 一致性 |
|
||||
| contract_execution | 首轮 7/9;两个 CMS 失败因关联传播要求 ArticleView,修复后 CMS parity 与 maintained root checker 各 1/1 通过;未重复整个目标 |
|
||||
| contract_semantics | 完整目标 6/12;6 个既有 error 直接构造样例未重跑;当前 private_fields_protect_access_mutation_and_construction 精确用例 1/1 通过 |
|
||||
| git diff --check / 本次文件尾随空白扫描 | 通过;项目源码目前未跟踪,因此额外执行显式文件扫描 |
|
||||
| rustfmt/clippy | 未安装组件;rustfmt 启动失败,未安装或绕过 |
|
||||
|
||||
contract_semantics 未通过用例:failure_cannot_be_discarded_overwritten_logged_or_laundered、errors_can_be_returned_translated_or_explicitly_recovered、failure_summaries_follow_long_calls_and_unused_handler_dependency_cycles、nested_failure_survives_value_copies_and_projection、empty_traversal_does_not_handle_context_and_singleton_projection_transfers_failure、possibly_empty_or_null_outputs_cannot_hide_another_failure。首个诊断均为 C005 `error choice variants can only be used with fail`。
|
||||
|
||||
当前没有新配置入口、没有登录业务、没有真实数据库/全量/服务/性能验收。Model create/update/读取 private 字段通过静态检查与 schema 不变验证;未据此声称已完成真实数据库运行验收。
|
||||
@@ -0,0 +1,37 @@
|
||||
# Dever 安全数据合同
|
||||
|
||||
## Goal
|
||||
|
||||
让密码、令牌和部署密钥在 Dever 中具有编译器可识别的非观察边界,使大型应用能够存储私密 Model 字段、处理 Secret 和调用成熟密码算法,同时彻底移除环境变量配置入口。
|
||||
|
||||
## Dependencies
|
||||
|
||||
- 无前置子任务;这是 Port setting、认证 API 和 CMS 会话的基础。
|
||||
|
||||
## Requirements
|
||||
|
||||
- Model `private` 字段由所属 component/domain 的 App 拥有;生成的 Model CRUD 可以持久化,所属 App 可以访问,其他角色和领域不能访问。
|
||||
- 含 private Model 字段的完整 Model 不能出现在 App 输入/输出、API/Job wire 输出、日志或跨领域类型观察面;App 使用显式 View record。
|
||||
- 新增 opaque `Secret` 标量:不可 Render、比较、拼接、普通 JSON 编码、Map key、Model 存储或错误 payload。
|
||||
- Secret 只允许进入批准 sink:Argon2id hash/verify、HMAC、常量时间验证、后续受控 Cookie/bearer setting sink;不提供通用 Secret-to-Text。
|
||||
- 提供操作系统 CSPRNG token、Argon2id 密码 hash/verify、SHA-256、HMAC-SHA256 和常量时间字节/摘要验证;使用成熟依赖,不自实现密码算法。
|
||||
- 密码哈希存储为 private Text,明文密码使用 Secret;错误不得包含明文、密钥或摘要原文。
|
||||
- 删除 `dever.process.environment` 及对应 intrinsic/runtime bridge、文档和测试;不保留别名、fallback 或 deprecated 路径。
|
||||
- `dever.process.arguments` 保留,但不得成为 setting override;配置来源规则由后续 Port/Job/API setting 合同继续约束。
|
||||
- `.dever` 与 `.dever.md` 使用相同语法/语义;所有正式测试放根 `test/`。
|
||||
|
||||
## Acceptance Criteria
|
||||
|
||||
- [ ] 所属 App 可创建、更新、读取 private Model 字段,并能用其验证密码;其他角色/领域的字段访问在 check 阶段拒绝。
|
||||
- [ ] App 签名、API response、日志和普通 JSON 对 private/Secret 的直接或嵌套泄漏均被静态拒绝。
|
||||
- [ ] Secret 不能被渲染、比较、拼接、存入 Model/Map key 或放进普通错误 payload。
|
||||
- [ ] secure token 两次调用不复用值且使用 OS CSPRNG;无随机源时返回显式安全失败。
|
||||
- [ ] Argon2id hash/verify 验证成功、错误密码、损坏 hash 和资源上限;SHA/HMAC 与已知向量一致。
|
||||
- [ ] 搜索和负向编译测试确认应用无法调用环境变量读取,仓库没有兼容入口。
|
||||
- [ ] 既有普通 record private 字段、Model schema、API envelope、日志和 Markdown 回归保持通过。
|
||||
|
||||
## Out Of Scope
|
||||
|
||||
- 通用密钥管理服务、密钥轮换协议和硬件安全模块。
|
||||
- JWT/OAuth、会话业务模型、RBAC 和登录 API;由后续 API/CMS 子任务实现。
|
||||
- 数据库列加密;private 表示可见性,不声称静态或磁盘加密。
|
||||
@@ -0,0 +1,70 @@
|
||||
# Research: 安全数据合同源码边界
|
||||
|
||||
- Query: Model private、Secret、密码学及 environment 移除的最小实现路径。
|
||||
- Scope: internal
|
||||
- Date: 2026-09-20
|
||||
|
||||
## Findings
|
||||
|
||||
### 字段与领域身份
|
||||
|
||||
- `crates/dever-core/src/syntax.rs:124` 的 AST `Field.private` 已存在;`parser.rs:517`、`:556` 解析普通 record 的 private,选择分支不允许 private。无需新增语法关键字。
|
||||
- `check/symbols.rs:373` 将 AST private 原样落到 `types.rs:188` 的 checked `Field`。HIR 表达式直接持有 checked Type,因此不需要另造字段隐私 HIR。
|
||||
- `types.rs:209` 的 `Definition` 已有 owner、kind;`DefinitionKind::Model` 可区分普通 record 与 Model。`source.rs:25` 的 SourceRole、`:84` 的 `SourceLayout::domain()` 是领域身份唯一来源,不应拆字符串判断归属。
|
||||
- `check/model.rs:539` 当前硬拒绝 Model private;移除此拒绝后已有字段落地流程可保留 metadata。`synthesize_fields`(`:219`)仅插入公开 id/created_at,生成 Page/Cursor 及 Related 字段。持久 schema `ModelField` 不必承载语言隐私,因为数据库列格式不因访问策略改变。
|
||||
- `check/expressions.rs:167` 的 `Body::field_type` 按 type.owner == context.owner 检查私有字段;写路径复用字段解析。`check/values.rs:41` 独立进行 record 构造授权。两处应改用同一 owner 检查:普通 record 保留 package 私有;Model 只允许同领域 App。可直接复用 `check/orm.rs:247` 对 SourceRole::App 和 layout.domain 的判定。
|
||||
- `check.rs:506` 的 validate_public_boundaries 只拒绝 private nominal type,并跳过 public record 的 private 字段;它不会拒绝一个 public Model 内含 private 字段。`:557` 的 validate_exported_failures 只检查错误类型自身 public 标志,嵌套 Model 同样需要补覆盖。
|
||||
- `check/api.rs:149` 的 json_type 已拒绝 record private,但自写递归,与 App 合同尚未共享。建议统一类型可观察性属性,再由 API 保留具体可编码标量白名单。
|
||||
|
||||
### Secret 与类型能力唯一所有者
|
||||
|
||||
- `types.rs:7` 的 Type 增加独立 Secret;`check/symbols.rs:300` 附近是源码内置标量解析入口;`native.rs:766` 附近是 Rust 表示映射;`reference/value.rs:17` 是 reference Value 枚举。不要用 Named record 或 Bytes 别名模拟 Secret。
|
||||
- `types.rs:232` 的 Properties + `cache_properties` 已按 nominal DAG 缓存 comparable/transferable/movable。建议在此集中增加可渲染/敏感类型属性;避免在 API、App、fault 三处复制 nominal 图遍历。
|
||||
- `check/symbols.rs:452` 的 map_key 是独立白名单,Secret 默认不匹配;`check/model.rs:1320` 的 normalize_field_type 是持久化白名单,Secret 默认不可持久化。无需把所有存储参数检查迁入通用 Properties;仅共享安全属性。
|
||||
- 风险:`Type::Related` 目前直接返回 Properties::ALL(types.rs:92),且 referenced_types(check/symbols.rs:471)特意不展开 Related,避免合法关联 Model 环。敏感信息属性若沿用该路径会漏检,若简单递归则可能死循环。使用有界反向传播/固定点处理关联图,或者在对外可观察类型中拒绝 Related;不能影响现有布局/可比较缓存算法。
|
||||
- `native/records.rs:40`、`:82` 无条件为 record/choice 生成 Render,逐字段调用 render_to,当前 private 字段同样被渲染。`reference/value.rs:134`、`:177` 同样逐字段展示。Secret 的静态禁令必须覆盖容器和选择 payload;不应靠运行期脱敏代替编译拒绝。
|
||||
- 原生类型统一 derive Clone/Debug(native/records.rs:25);Secret Rust 表示可有安全 Debug 占位,但不能输出原始字节。不提供普通 Render 实现时,生成器需要避免为包含 Secret 的 nominal 类型生成不可编译 Render,同时错误/入口输出等 render sinks 必须先检查。
|
||||
- 日志内置签名在 `check/intrinsics.rs:108`,当前接收 Text;应保持此边界,不增加任意值日志转换。JSON 标准库采用显式 JSON 类型,API 泛型序列化是需额外保护的边界。
|
||||
|
||||
### environment 完整删除链
|
||||
|
||||
1. `library/dever/process.dever:6` EnvironmentResult、`:23` environment 及两个 environment_value 分支。
|
||||
2. `crates/dever-core/src/intrinsic.rs:26` ProcessEnvironment 枚举、`:140` process_environment 名称解析。
|
||||
3. `check/intrinsics.rs:85` 签名及官方 EnvironmentResult shape 验证。
|
||||
4. `contracts/effects.rs:549` process effect 分类,保留 ProcessArguments。
|
||||
5. `native/intrinsics.rs:72` resource_result → `dever_runtime::process::environment`。
|
||||
6. `reference/intrinsics.rs:69` recover → 同一个 runtime 函数。
|
||||
7. `crates/dever-runtime/src/process.rs:16` environment 桥接函数。
|
||||
8. `test/dever-tests/tests/standard_library.rs:77` process 输入测试及 `:115` 直接 runtime 错误测试;`differential.rs:331` environment 错误一致性样例。
|
||||
9. `README.md:65` 文档明确宣传该入口,也需要同步删掉。
|
||||
|
||||
已有 argv arguments 是独立能力,保留。测试环境配置不要换成另一个应用环境变量入口;删除 environment 专项并增加旧 API/旧 intrinsic 被拒绝的定向断言。
|
||||
|
||||
### 依赖与密码学复用
|
||||
|
||||
- `Cargo.toml:36` 已精确锁定 getrandom = 0.2.17;runtime `orm.rs:86` 用 getrandom::getrandom。runtime Cargo.toml 当前只在 database feature 下启用,非数据库 crypto 不能依赖 database 才有随机源。
|
||||
- Cargo.lock 中另有 getrandom 0.4.3(433)、hmac 0.13.0(490)、sha2 0.11.0(1059)、subtle 2.6.1(1143);这些只是已解析的间接依赖,不代表 runtime 可直接 import。
|
||||
- Cargo.lock 已有 zeroize(1650);没有 argon2。采用 Argon2 crate 时需核对其 digest/password-hash/rand_core 版本,不应假定已锁 sha2/hmac 与任意版本 Argon2 相容。
|
||||
- 官方包装遵循 process/time 的 Result choice + checker shape 校验 + native resource_result + reference recover;crypto 重用该协议。运行时集中到 crypto 模块;Secret 字节访问保持 crate 内部,禁止公共 reveal。
|
||||
|
||||
### 最小定向测试
|
||||
|
||||
- `contract_semantics::private_fields_protect_access_mutation_and_construction`(218)保留普通 record package-owner 基线。
|
||||
- `source_architecture::model_operations_belong_to_the_owning_domain_app`(209)扩展 Model private 字段读写、同领域不同 App topic、Domain/API/Test/跨域拒绝、App 嵌套参数/输出/错误泄漏。
|
||||
- `model_syntax` 覆盖 private 持久声明及 Secret 存储拒绝;`markdown_source` 验证 private 往返和两种源码一致。
|
||||
- `contract_api` 覆盖快照不会暴露私有表示,以及公开边界敏感类型拒绝。
|
||||
- crypto 新的根 test/dever-tests/tests 定向文件可以集中运行时已知答案、native/reference 一致性、Secret 禁止 Render/eq/Map-key/JSON/persistence;`test/dever-tests/Cargo.toml` autotests=false,必须注册新目标。
|
||||
- `standard_library` 和 reference feature 下 `differential` 修改 environment 案例。优先 cargo test -p dever-tests --test <target> <filter>,无需真实数据库、服务、全量测试。
|
||||
|
||||
### Related specs / External references
|
||||
|
||||
- `.trellis/spec/backend/compiler-contracts.md`:字段隐私、App 边界、角色及有界类型图。
|
||||
- `.trellis/spec/backend/database-guidelines.md`:Model 所有权、静态 schema、settings-only 配置。
|
||||
- 当前任务 `design.md`:Model domain-App owner、opaque Secret、无环境变量兼容路径。
|
||||
- 外部资料未访问;版本事实来自当前 Cargo.lock,密码算法参数/具体 crate API 需实施者按实际选定版本的官方资料核实。
|
||||
|
||||
## Caveats / Not Found
|
||||
|
||||
- 子会话 `task.py current --source` 返回 none;输出路径由父代理明确提供,未修改任何任务指针。
|
||||
- 未执行构建、测试或服务;结论为源码研究,不是运行验收。
|
||||
- 未发现可复用 Secret 或 argon2 实现。上述 Render 风险是当前实现事实;静态渲染入口完整枚举应在实现阶段继续检查 native entry/failure/assert 渲染,不能只修改 native record emitter。
|
||||
@@ -0,0 +1,26 @@
|
||||
{
|
||||
"id": "secure-data-contracts",
|
||||
"name": "secure-data-contracts",
|
||||
"title": "Dever 安全数据合同",
|
||||
"description": "实现 Model 私密字段、Secret、密码与安全随机能力,并移除应用环境变量配置入口",
|
||||
"status": "completed",
|
||||
"dev_type": null,
|
||||
"scope": null,
|
||||
"package": null,
|
||||
"priority": "P1",
|
||||
"creator": "Antigravity",
|
||||
"assignee": "Antigravity",
|
||||
"createdAt": "2026-09-20",
|
||||
"completedAt": "2026-09-20",
|
||||
"branch": "main",
|
||||
"base_branch": "main",
|
||||
"worktree_path": null,
|
||||
"commit": null,
|
||||
"pr_url": null,
|
||||
"subtasks": [],
|
||||
"children": [],
|
||||
"parent": "09-20-production-application-language",
|
||||
"relatedFiles": [],
|
||||
"notes": "Model private/Secret/crypto/environment removal/CMS View contracts complete. Independent quality gate and final review found no blocker; focused checks and secure_contracts 8/8 passed. Known unrelated contract_semantics legacy failures remain documented.",
|
||||
"meta": {}
|
||||
}
|
||||
Reference in new issue
Block a user