状态:Core 0.10 设计基线已确定,工具链 0.34.0 已于 2026-09-13 发布。 发布、持续集成与消费项目的验收分别记账;最近核对日期为 2026-09-20。
VelarScript 应让模型发现并正确使用语言能力,让人能从局部代码看懂数据、控制流、 副作用和失败。可靠性来自明确的标准、编译器检查和必要的运行时检查共同兑现。
本轮以 OpenVoxel 的真实代码和当前编译器为依据。采用以下裁决顺序:
- 先写出真实问题和现有能力为什么不足,再决定是否增加语法或 API。
- 同一种语义使用一致的规则;类型别名、泛型、跨模块和解构不能改变规则。
- 简洁以减少需要理解的概念为准,同时保留名称、所有权和失败信息。
- 静态能判断的错误在编译期拒绝;动态才能判断的错误在拥有该边界的运行时拒绝。
- 自动修复必须证明语义等价。涉及业务名称、所有权、错误恢复或执行顺序的决定 由模型结合项目上下文完成,不能靠无条件批量替换。
- 只有缺少客观优劣的偏好选择需要所有者决定。实现缺陷不交给所有者兜底。
“核心定下来”指下表和具体裁决足以判断程序的合法性与行为,并能据此编写验收测试。 它不表示某次测试证明了实现不存在任何缺陷,也不禁止未来经过同样论证的版本化演进。
现有详细规则由 language-charter.md 定义。本表固定各域 承诺的范围;后文列明本轮需要统一的地方和实现验收状态,避免把设计完成当作实现完成。
| 领域 | 固定承诺 | 检查与责任边界 |
|---|---|---|
| 语法与布局 | 缩进决定块;def、type、class、enum 各自拥有清晰职责;条件表达式为 condition ? yes : no;字符串插值为 f"{value}" |
解析器、格式化器、补全和文档使用同一词汇;恢复错误所用的 AST 节点不是可供作者使用的语法 |
| 绑定与身份 | const 固定绑定,let 允许重新赋值;记录和集合保留引用身份 |
固定绑定不隐含冻结对象;复制容器不隐含复制其中的对象 |
| 基本值与缺省 | number 采用 JavaScript 数值表示;缺省统一为 null;T? 等价于 T | null |
条件接受 bool/bool?,仅 true 进入真分支;其他类型的存在性必须明确检查 |
| 数据建模 | 记录结构化;别名不创造新身份;enum 表达有限身份,可用成员单例类型作为记录判别字段 | 同形记录可以兼容;需要行为、身份或资源生命周期时使用 class |
| 泛型 | 用户可定义泛型函数、记录和 class;边界约束和调用处推断属于正式能力 | 推断从声明和调用上下文得到,不从后续写入倒推;不要求模型编写类型级程序 |
| 写入权限 | readonly 逐层保护槽位;声明级只读合并同层字段修饰 |
按 D117 执行;它是静态视图,不承诺全局唯一所有权或运行时冻结 |
| 函数与调用 | 参数、默认值、具名参数和返回值形成可检查契约;参数表达式按源码顺序求值 | 具名参数重排不能重排副作用;调用不能通过类型检查扩大原有可写值域 |
| 分支与窄化 | if 表达条件执行,match 表达完整分类;检查成功可增加已知事实 |
形状检查不能授予原类型禁止的写入;失效的流事实按既有窄化边界重新验证 |
| 集合 | List 同型;Map/Set/Record 保留自己的键和值契约;查询、转换、聚合由集合成员表达 | 索引越界与查询缺失有区别;可变位置保持写入兼容;只读视图的协变不得穿透嵌套可写位置 |
| 迭代与求值 | List 回调使用检查后的浅快照;普通 List for 观察实时长度;循环双槽为 value/index,Map 双槽为 key/value |
有顺序副作用、多个输出或跨项状态时保留循环;自动修复不得把实时迭代变成另一种行为 |
| 错误 | 预期缺失使用 optional;可区分失败使用错误类型;断言表示程序不变量 | try expression 显式转为 optional,但不吞掉 AssertionError、NarrowingError、IndexError;需要处理它们时写显式 catch |
| 异步与资源 | await 等待;detach 明确交出无返回值任务的失败处理;using 表达作用域所有权 |
不默默丢弃 Promise;资源退出顺序、异常退出和异步释放均须验收;宿主取消能力由宿主契约声明 |
| 模块与外部值 | 模块形成显式依赖;外部未验证数据进入 unknown;使用真实 contract 或 Type.parse 进入类型世界 |
Core 保持目标中立;文件、网络、UI、数据库等能力由对应扩展或项目库拥有 |
| 数据验证 | Type.is/is 检查形状,Type.parse 验证并复制可检查数据,Type.from 对已类型化数据作浅层目标投影 |
opaque 字段和 class 身份保留其边界;业务约束由边界所有者组合验证;边界形状检查和 parse 不执行属性 getter;窄化重检遵循下述独立边界 |
| 标准 API | 永久命名空间、prelude 和 Core 标准模块均是可发现、可测试的契约 | API 的接收者、参数名、返回值、缺省、错误、顺序、复制和副作用都需要确定;便利名称需要真实用例支持 |
| 模型入口 | 根入口给出能力地图和使用决策,安装包提供与版本匹配的本地参考及例子 | 模型无需先猜出一个错误写法才能发现能力;文档、模板、编辑器和 CLI 的可用语法不得互相冲突 |
外部数据通过具名 Runtime Type 的验证进入类型世界;边界形状检查和 parse 只检查数据属性,不执行 getter。流窄化的后续重检是在使用点复核已有事实, 不代替外部边界验证,也不构成全程序副作用或别名证明。
同一可检查数据结构使用具名记录或匿名结构表达时,运行时应检查相同的字段 契约:自有、可枚举的数据属性,保持可选字段规则,不执行 getter。递归和深度 不能让未证明的结构直接成为合法值;循环检测必须同时识别对象与检查计划, 并保留不同泛型实例的检查身份。真正不透明的能力与擦除泛型仍只能保留已有 运行时证据。实现已覆盖属性描述符、深层/循环数据、泛型、跨模块及重复读取成本的 定向验收,整体验收结果按下方候选快照记录。动态导入必须保持 原有加载时机;循环依赖中合法的提前函数调用不能因内部校验对象尚未初始化而失败。 项目链接器必须使用共享编译器运行时;compile API 对携带跨模块校验或命名空间 元数据的 inline 配置直接报错。单模块 compile 仍支持默认内联运行时。
采用 D117。readonly List<State> 保护列表槽位,State 按自身类型允许写入;
List<readonly State> 保护每个 State 对象的同层字段;两层都要保护时分别表达。如果 State 本身
是 readonly type,使用处写 State。
readonly type 和全部字段逐一只读的记录应有相同的结构兼容结果。混合读写记录
仍支持字段级修饰。A20/A21 只化简等价写法,不能推断业务需要多深的保护。
对已知类型的值做 is 或类型模式匹配时,检查证明的是当前形状;它不能证明未来
的任意写入、删除、回调副作用或 Promise 结果都安全。
必须同时保持:
- 原有只读层和只读字段;
- 原类型必需的字段以及字段可接受的值域;
- 原容器可以安全存入的元素、键和值类型;
- 已知函数的可接受参数和返回契约。
例如把 {x, y} 检查为 {x},不能获得用 {x} 替换原值、导致 y 缺失的权限。
把具名记录检查为动态 Record,也不能获得删除必需字段的权限。类型系统如果不能
在同一视图中分别表达读取和写入契约,应保守限制相关写入,而不是默许破坏原类型。
unknown 的形状检查仍是进入类型世界的正式入口。静态只读保护的是通过该类型
表达的使用权限;它不宣称可以追踪所有外部别名或阻止外部 JavaScript 的任意写入。
每个 match 都必须能够证明覆盖输入静态类型的全部可能值。
- bool 覆盖 true/false,enum 覆盖成员,optional 还覆盖 null,联合覆盖各成员。
- enum 成员联合只要求覆盖该联合实际包含的成员;别名不改变覆盖要求。
- guard 可能为 false,不能单独贡献完整覆盖证明;带 guard 的
_同样不是兜底。 - 已有的结构性证明继续有效,例如
[]与[first, ...rest]覆盖所有 List 长度, 必需字段上的无条件记录模式也可构成完整覆盖。 - 无法证明完整覆盖时,要求无 guard 的兜底分支。剩余情况有意不执行动作时,
case _: pass明确表达这一点。 - 分支按源码顺序首次匹配;结构类型可以重叠。完整覆盖不等于各分支互斥。
match继续是语句,分支使用普通 return 或赋值。局部条件执行通常使用 if。
这条规则使用现有类型词汇,不引入字符串/数字字面量类型、match 表达式或另一套 分支控制流。
OpenVoxel 的静态盘点发现 24 处 match:15 处列齐对应 enum,9 处有无 guard 兜底。 当前消费树已完成 12 个工作区的类型检查,具体版本与验收范围见下方复验记录。
Core 的固定形状组合采用记录,通用两项配对采用现有 Pair<A, B>,同型序列采用
List。具有业务意义的多个结果必须有字段名,调用方不依赖 [0]、[1] 的约定。
OpenVoxel 的 horizontalCell 使用 HorizontalCell 记录返回四个 number:
gridX、gridZ、amountX、amountZ。记录同时固定字段集合和字段含义;元组只能
固定位置类型,在四项同型时仍不能说明每个位置代表什么。
本轮证据尚未发现必须由任意长度异构元组解决、而现有记录或 Pair 明显不合适的 Core 场景。tuple 语法因此不进入当前核心基线。以后如出现异构并发组合、固定外部 位置协议等真实需求,必须先说明具名记录或边界 adapter 的具体不足,再单独裁决。
整数性与 JavaScript 安全整数范围是不同属性,名称必须表达实际检查。
number.isInteger()判断有限且没有小数部分的 number。number.isSafeInteger()进一步要求处于 JavaScript 安全整数范围。velar/validation.integer()与.isInteger()使用同一整数判定;velar/validation.safeInteger()与.isSafeInteger()使用同一安全整数判定。 诊断分别说明整数要求和安全整数范围,不把“超出安全范围”写成“不是整数”。- 两个规则都接受可选的 minimum、maximum、message。闭区间约束独立叠加, 非空边界必须是有限 number,minimum 不得大于 maximum。边界本身可以有小数, 例如 [0.1, 1.9] 接受整数 1;一个合法区间内没有整数仍是合法约束。
- 集合的长度、索引和容量继续要求各自允许范围内的安全整数。普通 integer 验证不能替代这些 API 自己的边界检查。
OpenVoxel 现有 19 个 integer 规则都给出了安全整数范围内的显式上下限。 上述调整不改变这 19 个规则的接受集合。
入口按任务组织能力:建模、转换、查询、验证、资源、异步、错误和测试,并明确 推荐写法成立的前提。根入口保持可读,详细语法/API 按需读取本地参考;所有引用 都随工具链版本一起交付,安装后可访问。
最低要求:
- 所有正式 Core 构造均能从入口找到语法、真实用途、约束和可编译例子。
- 现有泛型、记录投影、optional、比较链、解构、集合聚合与迭代、using、try 表达式、 duration 和 readonly 均有发现路径。是否实际采用由任务决定。
- 教学材料不能声称 unsafe 值是可自由使用的 any,也不能把 bool? 误写为不允许。
- 语法名册中的示例必须是可用语法;错误恢复形式不能出现在可用能力表中。
- 诊断指出失败位置、实际契约和合理的下一步;对嵌套验证的路径能力单独列出 当前实现与目标,不用笼统的“验证失败”掩盖深层问题。
- 自动修复保留注释、值类型、求值顺序和副作用。修复后重新检查,并验证重复执行 不再继续改写。
Type.parse、Json.parse(text, Type)、validation.parse/safeParse 和绑定的
validator 共用失败定位规则。路径是结构化数据,message 由路径生成;程序不从
错误消息反向解析路径。结构检查报告第一条失败,语义规则继续按既有上限聚合问题。
公开的 ValidationPath 是逐段只读的 List;ValidationPathSegment 是以下形状的
只读记录联合,由 ValidationPathKind 判别。相关类型由 velar/validation 发布,
编译器产生的 ValidationError 使用相同身份和结构,拥有同一份定义。
| kind | 附加字段 | 意义 |
|---|---|---|
| field | name: string | 声明字段或语义规则显式命名的字段 |
| listIndex | index: number | List 中的零基索引 |
| mapKey | index: number | Map 插入顺序中的第几个键 |
| mapValue | index: number | Map 插入顺序中的第几个值 |
| setElement | index: number | Set 插入顺序中的第几个元素 |
| recordEntry | index: number | 动态 Record 枚举顺序中的第几个属性值 |
| truncated | 无 | 诊断预算耗尽;只能作为末段,前面的段是已确定的路径前缀 |
位置的 index 必须是非负安全整数。根位置是空路径。ValidationError.path 与 ValidationIssue.path 使用这一共同类型;field 等便利信息如需显示,也必须从 路径产生,不能另存一套可能不一致的位置。手动构造且没有位置的 ValidationError 使用空路径。
例如 items 中第 4 项的 name 不合法,路径为 field(items)、listIndex(3)、 field(name)。Map 的键和值角色单独表达,不能与业务字段名 key/value 混淆。 诊断不为动态集合条目调用 toString 或其他用户转换方法。
定位遵守以下边界:
- 缺失字段定位到该字段;元素失败定位到对应元素;容器品牌失败定位到容器。
- 字段描述符和集合检查沿用捕获的原生操作,不执行 getter。
- 联合的判别字段能确定分支时深入该分支;否则在联合位置报告期望类型,不猜测 “最像”的分支。class、Promise 等不透明值保留叶子边界。
- 递归状态按对象身份与检查计划共同识别;别名、继承和泛型不能截断可确定的路径。
- 路径最多 64 段,诊断消息最多 4096 UTF-16 code units,额外诊断定位遍历最多 4096 个节点。耗尽时保留已知前缀并以 truncated 结束,明确说明诊断被截断。 这些诊断预算不改变成功验证的接受范围。
- 相同输入、类型和捕获的集合顺序产生相同的首条结构失败位置。
这是一项实际的 Core 接口调整,需要连同泛型检查计划、运行时集合验证、错误类型、 语义验证和下游诊断一起实现并验收。
Core 归属表示目标中立,永久名称表示所有程序都可直接发现,纯度表示求值是否会 读取变化的状态或产生可观察副作用。这是三个不同的问题。
现有 Math.random、Promise.sleep 和 print 已说明 Core 和永久名称不能笼统
承诺纯计算:它们分别观察非确定性、调度时间和输出诊断。保留这些明确命名的
通用语言运行能力;文件、网络、进程、环境和 UI 资源仍通过显式导入的能力访问。
Core 中按需导入的确定性计算库也仍然属于 Core。
新增永久名称必须证明通用性、目标中立和直接可识别的职责;既有四个命名空间 继续作为固定词汇。一个函数是否可以缓存、移动、重复或合并,只能依据该操作 自己的契约和证明,不能根据它属于 Math、Core 或某个已导入模块来推断。
可检查记录结构统一按上面的数据属性和递归规则验证。匿名结构中的必需字段 即使类型为 unknown,也必须存在且为数据属性;字段谓词恒为 false 时必须拒绝, 不能丢弃该字段检查。未知或不透明值的内部不可检查,不等于它所在的必需字段 可以缺失。实现必须复用捕获的原生操作,并验证热路径的重复读取成本。
此表记录已确认事项,不把“没有发现更多”解释为“没有更多”。
| 项目 | 证据 | 标准/设计状态 | 实现验收状态 |
|---|---|---|---|
| C1 readonly 层次与规范写法 | OpenVoxel creative-flight.vel 逐字段 readonly;旧兼容检查拒绝等价视图 | D117 已确定 | 实现、A20/A21 与定向测试随 0.34.0 发布;发布 CI 和本次定向复验通过 |
| C2 已类型化值的窄化写入 | 小记录视图可破坏大记录的必需字段;动态 Record 可删除必需字段;容器可注入受保护元素 | 保留原写入契约已确定 | 修复随 0.34.0 发布;发布 CI 和本次只读、窄化组合复验通过 |
| C3 match 完整覆盖 | bool、record 联合、enum 成员联合的漏分支未被统一拒绝 | 统一覆盖规则已确定 | 实现随 0.34.0 发布;发布 CI 和本次穷尽检查复验通过 |
| C4 多返回值的形状 | terrain.vel 的 horizontalCell 返回四项 List | 采用具名记录;Pair 保持通用两项配对 | OpenVoxel 11f74fb 已使用 HorizontalCell;正式安装 0.34.0 后工作区检查通过,当前消费树的运行时复验仍单独记账 |
| C5 整数边界 | isInteger 接受 2^53,validation.integer 实际使用 isSafeInteger | 两组同名谓词与验证规则已确定 | 实现与数值边界测试随 0.34.0 发布;发布 CI 通过 |
| C6 能力入口 | Core brief 缺少完整的语法发现路径,生成 AGENTS 仍把 unsafe 写成 any | 按任务发现、按版本交付已确定 | 离线 topics 已实现;打包参考的相对链接及锚点已闭合,隔离安装布局验收通过;生成一致性复测见下方 |
| C6 文档和名册冲突 | standard-library.md 声称没有用户泛型;ConditionalExpression 名册给出被解析器拒绝的 Python 写法 | 以正式 Core 规则统一 | 文档、名册已更正,新增名册一致性测试 2/2 通过 |
| C7 嵌套验证诊断 | 结构验证与语义验证的错误路径精度不同 | 共同结构化路径与定位边界已确定 | 共享路径已实现;相关定向测试 110/110 通过;全仓检查结果见下方验收记录 |
| C8 归属与纯度 | 永久命名空间被文档统称为纯计算,但包含 random、sleep 和 print | 三个独立判断已确定 | 文档分类已更正;保留操作级求值与副作用验收 |
| C9 结构与跨模块检查 | 直接字段读取会执行访问器;深度/递归回退会漏检;签名中的私有 Runtime Type 会被裁剪 | 可检查结构统一字段、递归和跨模块保证 | 修复随 0.34.0 发布;发布 CI 和本次结构、共享运行时验证复验通过;开发期动态导入、循环调用与包产物证据见下方 |
| OpenVoxel 共享数据边界 | 注册表返回的 properties/physics/behaviors 在新层次语义下仍可修改,可能破坏缓存索引一致性 | 发布数据图明确声明每一层写入权限;复用原领域类型 | 11f74fb 已安装 0.34.0 及 database 0.3.4、sql 0.1.4、sqlite 0.3.5;12/12 工作区检查通过;开发期隔离测试与当前消费树的运行时、浏览器验收分别记账 |
| 文档上下文验收 | 83 个片段缺少完整上下文,其中含真实包资源导入 | 每个片段显式提供其编译所需上下文 | 全部 281 个示例已完整分析;新增隔离资源 fixture,默认 check:docs 拒绝覆盖缺口 |
- 0.34.0 对应提交
ff53a6bc25983b317458394e7a4fb44b32fc9744,v0.34.0与主线指向该提交。npm 发布流程 成功;核对时@velarscript/compiler的latest、next均为 0.34.0。 - 该提交的持续集成 于 2026-09-20 通过:Source quality、Ubuntu/macOS Node suite、Ubuntu full Node suite、Browser suite、Ubuntu/macOS packed consumers。平台与套件按实际 job 列出;每项通过只证明该次运行覆盖的契约。
- 同一源码基线在本机重建全部包后,复验七个完整测试文件:
readonly-layers、readonly-advisories、match-exhaustiveness、structural-runtime-validation、validation-paths、shared-runtime-type-validation和runtime-type-validation-performance.slow,60/60 通过。 - 额外静态探针覆盖九种容器或记录写入契约,分别经
is、Type.is、match检查,再组合普通、optional、union 输入,共 81 个程序,接受或拒绝均符合预期。 这些是定向组合检查;模型能力仍需独立的任务盲测衡量。 - 本机现有性能回归的两百万次
Type.is中位数:Point 66.0ms,嵌套 Sample 157.4ms,均在测试预算内。这是该机器与基准输入的结果,实际项目成本需要独立测量。 - OpenVoxel 干净提交
11f74fb的 manifest 与已安装包均使用 0.34.0;已安装 database 0.3.4、sql 0.1.4、sqlite 0.3.5。通过项目自己的npm run check:workspaces串行检查,12/12 工作区通过。当前源码中horizontalCell返回HorizontalCell。本次消费项目复验范围为安装与类型检查。
当前需要独立补齐的证据是:消费树的运行时测试、生产构建与 Web/GPU 验收; 新模型入口的任务盲测;真实项目中的验证成本。每项记录自己的输入版本、运行命令 和结果,再更新账本;语言仓 CI 与开发期隔离结果各自保留其证明范围。
以下保留发布前的本地与隔离消费项目证据。发布结论及当前安装复验见上一节。
- 包构建、格式、281 个完整分析的文档示例、运行时边界、项目构建、示例 API 覆盖、surface 版本、文件预算、模块地图、生成源码、测试归属及 TypeScript 检查通过。最终 emitted-output 指纹比较通过,共 834 个文件。
- 修复发射断言后,release:check 的 quick Node 阶段 3657/3657 通过。 示例项目 unit gate、packed-consumer、开发及 CSP 生产浏览器验收、真实安装 后的 Chromium 验收均通过;浏览器示例共 46 项。
- 完整 Node 慢速阶段覆盖 4006 项,首轮 4000 通过、6 失败:5 项需要按新的 readonly、match、窄化规则迁移旧测试,1 项需要排空监听测试的准备事件。 修复保留非法程序拒绝和真实运行验证,涉及 5 个完整文件复测 68/68 通过。 最终提交的独立 CI 已通过,具体平台与套件见上一节。
- 本机曾出现 Node/macOS 目录监听不交付事件,原生对照也复现;后续 quick 和 full 中该用例均通过,未修改运行时、断言或超时。保留初次失败及对照证据, 不把环境推断当成已证明的操作系统内部原因。
- C9 最终构建的结构检查与 CLI 路由定向 39/39 通过,包含动态导入、多路径、 循环提前调用、源码包和已认证冻结产物。npm prepack 诊断走 stderr,真实 prepack JSON 回归与相关参考测试 10/10 通过。
- OpenVoxel 候选由 88 文件语言迁移、21 文件版本配置、21 文件目录检查增量 按序组成。隔离副本的 12 个工作区格式、类型检查和构建全部通过,错误和 advisory 为 0;343 项 Vel 测试、194 项 JavaScript 测试和 25 项结构测试通过。 GPU 场景及像素阈值验收通过;该记录描述当时的隔离副本。
- 配套 Labs 隔离候选 database 0.3.4、sql 0.1.4、sqlite 0.3.5 已重建, 源码测试 26/26、SQLite worker 8/8、真实 tarball 消费者 27/27 通过。 每次候选测试保留自己的输入快照;正式安装版本及本次复验范围见上一节。
- 完整发布检查包含 quick、示例项目、60 个 slow Node 文件、浏览器及 packed-consumer 验收;正式发布以对应提交的 CI 和发布流程为凭证。
默认文档检查现在要求完整分析。281 个示例中,129 个是完整示例,152 个 片段均提供或自带完整上下文,其中 101 个使用 preamble。缺失的包资源、JSON 或 CSS 文件由每个示例独立的临时上下文提供;检查后清理。新增片段如仍有 未解析的名称或资源,check:docs 直接失败,不得靠抑制诊断通过验收。
核心设计完成需要每项语义裁决、边界和实际缺口有明确结论;不要求给每一个常见 表达式增加新语法。核心实现完成则另需以下证据:
- 合法程序、非法程序、别名/泛型/跨模块、可写与只读位置均有针对性验收;
- 运行时验证覆盖真实外部值、空值、范围、别名身份及副作用;
- 解析、格式化、诊断、编辑器和安装后的模型入口与标准一致;
- OpenVoxel 的真实用例按标准重构并通过受影响的检查和测试;
- 运行仓库规定的 gate,发版前再运行 release:check 和安装包验收;
- 验收账本明确区分已通过、待验证和已知缺陷。发版按所有者的合并安排进行。