AMIR:Aira Modeling Intermediate Representation 规范:特征图、参数、约束与引用
主文档与完整目录。本分篇与主文档共同构成同一规范,版本、状态与权威以主文档为准;仅拆分阅读结构,条款编号和正文语义不变。
5. Node、Port 与 Feature DAG
Section titled “5. Node、Port 与 Feature DAG”5.1 Node
Section titled “5.1 Node”Node 是纯函数式操作实例。canonical Node 至少包含:
{ "op": "exact.linearExtrude", "opVersion": "1.0.0", "label": "Base extrusion", "inputs": {}, "outputs": { "solid": { "type": "ExactSolid", "role": "body.main" } }, "kernelHints": {}, "provenance": { "createdBy": "patch:initial" }, "extensions": {}}规则:
op与opVersion必须精确匹配当前 Operation Catalog 的 descriptor。- Node 的语义只能由 descriptor、inputs 和显式 settings 决定。
- Node 必须是无副作用、有限且可取消的;禁止读时钟、随机环境、网络、文件系统或可变全局状态。
- 有随机行为的 Operation 必须有必需的
seed: Intinput。 outputs必须与 descriptor 的端口名和类型完全一致;role可以进一步标注稳定语义角色。- map 的文本顺序不具有语义。NodeId 是身份,
label只是可修改显示名。
5.1.1 程序节点 exact.program【已实现】
Section titled “5.1.1 程序节点 exact.program【已实现】”运行时的主节点是 exact.program(当前 4.0.0)。它把一段受治理的 Replicad 源码作为常量输入,
把可变数值参数与上游形状绑定为普通 AMIR 输入,结果沿共同求值与事务路径提交:
inputs.source:同步 JavaScript 函数体,使用r(维护版 Replicad)、p(具名数值参数)与s(具名上游形状副本);无网络、DOM、import、随机或时钟;inputs.arguments:ParameterRef列表;inputs.names是同顺序的参数名 JSON 数组;inputs.shapes:形状绑定列表;每项为上游ExactSolid或ExactBRep的PortRef,或子实体选择。选择使用已有 ListValue,固定为[目标 PortRef, 生产者 PortRef, 引用 ConstValue];引用为NamedShapeReference或LineageShapeReference,前者生产者是所声明程序的 shape,后者绑定生产者节点、操作版本和输出端口。两个端口都是普通图依赖。inputs.shapeNames是同顺序的唯一形状名 JSON 数组。依赖排序、循环拒绝与上游修改传播复用共同图。宿主求值时解析选择,源 B-Rep 经维护版 Replicad 序列化进入一次性 Worker,同一源端口只反序列化一个私有拓扑副本,选中的成员在该副本中唯一解析,消耗副本不修改上游形状;inputs.fonts:内容寻址字体资源列表;inputs.values:数值绑定列表;共享参数为[ParameterRef, String(type)],程序结果成员为[PortRef(node, "values"), String(type), String(member)]。inputs.valueNames为同顺序名称数组,不能与 names 重名;绑定结果进入同一个 p 环境。省略两项表示没有数值依赖。inputs.valueTypes:数值结果名到 Length/Angle/Count/Int/Real/Ratio 的 JSON 对象;省略表示没有数值结果。outputs.shape:ExactBRepPort;outputs.values:NumericValues,没有数值声明时为一个空集合。两端口均属于当前程序契约。
计划 valueInputs 使用 {name:{type,parameterId}} 或 {name:{type,nodeId,value}};valueOutputs 使用 {name:type}。程序以 {shape,values:{name:number},namedShapes?} 返回结果。Length 使用 mm、Angle 使用 deg、Ratio 使用 1,Real 无量纲;Count/Int 必须为安全整数且 Count 非负。类型标签由作者声明,宿主检查边界类型、全部结果名称与数值域,不对任意 JS 做量纲证明。派生量执行依赖既有图排序、OCAF 脏标记和缓存恢复,数值影响不伪造几何来源。循环拒绝,不把有向计算当作联立方程求解。
公开节点读返回 valueInputs/valueOutputs,当前求值返回 programValues 的 nodeId、types 和 values;数值属于所读修订,进入程序输入/结果哈希与共同事务。它们是程序计算结果,独立尺寸、实体、孔位要求仍由已有原生检查核验。替换时省略映射保留关系,显式 {} 清空;被下游引用的结果删除或改类型将拒绝整个候选。共享参数可按别名编辑,派生量只能修改生产者计算或重新绑定输入。
几何结果仍可直接返回 Shape,或通过 { shape, namedShapes } 声明最终形状中 Solid、Face、Edge、Vertex 的稳定名称;namedShapes 与 values 可同时返回。稳定名称作为 §8 引用与 §10.3 守恒的依据,inputs.names 不承载这些子实体名称。namedShapes 的值还可为 {input, evolution, entityKind};evolution 是 unchanged|modified|generated,entityKind 是 Solid|Face|Edge|Vertex。宿主只从声明输入的真实内核历史和最终结果中解析恰好一个成员,多结果、无证据或同一输入内多个成员合并的结果拒绝命名。这是程序显式指定结果角色,不是把生成或合并证据自动认作旧身份。
当前共享计划契约为 aira.exact-cad-plan/0.18.0。build-program.inputs 将形状名映射到 {nodeId, port, namedShape?, selection?};namedShape 使用 {name, producerNodeId?, policy?},宿主把省略的生产者绑定到目标程序,新选择省略策略取 unchanged,并写入显式 AMIR 选择。selection 与 namedShape 互斥;新选择为 {revisionId,entityKind:"Face"|"Edge",entityId,policy?},entityId 来自该修订公开 faces/edges 查询。宿主将其写为带完整 lineageOrigins、producerNodeId、outputPort、operationRef、policy 的 LineageShapeReference;后续可直接复用 shapeBindings 返回的 {reference}。面使用 ArtifactGraph,公开边使用既有 EdgeGraph 邻接来源证据,来源集合歧义必须拒绝;没有稳定上游来源的成员不保证改参后继续存在。程序收到的 s.name 是所选子实体,不需要读取实现或猜测拓扑索引。公开模型节点的 shapeBindings 返回同一计划输入语法;原有 shapeNames/shapes 顺序编码不再作为 AI 模型摘要。创建不要求空模型;省略 bodyId 新建独立实体,指定已有 bodyId 则推进该实体 authority 并保留其名称、扩展及旧节点。结果成为 main 根,其余实体保留。推进现有实体时复用 affects 守恒与 expect.preserve,默认不允许改变未声明的命名几何。replace-program 必须指定 nodeId,省略 inputs 保留形状绑定,显式映射原子替换绑定。
replace-program 的 affects 和 expect 测量所选程序输出,适用于非主程序;下游持久断言仍全图验证。具名 set-parameters 编辑携带程序 nodeId,或直接使用全局 parameterId;其单次结果量测仍针对主输出,多对象要求应显式绑定持久断言。set-material 必须指定 bodyId,附带要求和质量测量跟随该实体。restore-revision 用明确的 revisionId 复用 model.revert,生成新的受验证修订;原 undo-redo-last-edit 成对验收宏已退役。当前程序 schema、模块及目录内容哈希同步更新,只维护这一份契约,不为旧文件隐式迁移。
源码进入 modelHash。对源码的修改走 §10.3 的守恒声明,而不是自由替换。节点 schema 见
exact-program-node-v4.schema.json。
跨程序来源由宿主在同次原生求值中观察,不由程序返回值声明。输入同时携带已求值 ArtifactGraph 子实体证据;Worker 在各声明输入内核对精确序列化对应,随后以原生 IsSame 和维护版变换、布尔、圆角、倒角、抽壳 builder 的 Modified、Generated、IsDeleted 记录后代。三个加工操作在 builder 释放前报告给既有观察通道;未观察的 simplify 等操作或重新构造的同形对象不因此获得输入身份。只有唯一同类延续可承接旧来源;分裂、合并、生成和无映射不会自动继承旧引用。
唯一延续按同类且非 generated 的对应判定。一个来源可以同时有唯一延续与生成后代,例如抽壳保留外底面并生成内底面;此时 outcome 为 unique,outputs 仍公开两类证据,只有外底面的延续承接旧身份。生成后代不计为原实体分裂,也不参与原身份合并计数;多个非生成延续仍为 split,多个不同来源延续到同一结果仍为 merge。此分类不保证任意几何加工均有可续接后代。
NamedShapeReference 的 policy 是当前持久契约必填项。unchanged 要求目标成员与当前生产者的命名实体具有相同来源、类型和精确几何;它不是冻结旧修订的几何快照。follow-source 允许具有宿主来源证据的唯一同类后代几何变化。程序输入与持久尺寸共用 resolveExactSubEntity,解析成功后仍独立检查要求;require-size 是世界轴向包络尺寸,require-bounds 还约束世界位置,不会随引用自动旋转、平移或改变数值。计划层新建要求的省略策略取 unchanged,修改既有要求时省略则保留已声明策略;不为缺失 policy 的旧 AMIR 建兼容分支。生产者改参或改源码后的名称是显式设计身份,当前程序到下游的来源证据不构成任意源码改写保持设计意图的证明。
公开 aira_model_read(includeReferences: true) 的 evaluation.programLineage 返回各程序的来源子实体、后代签名、unchanged/modified/generated 演化、unique/split/merge/generated/unmapped 分类及 deletionObserved。删除观察表示内核在已观察操作中报告过删除;unmapped 表示最终结果没有可证实对应,本身不证明删除。列表按节点、输入来源和后代稳定排序。该结果是当前求值证据,模型权威仍为源码、绑定与共同修订;不持久化第二份拓扑权威。
5.1.2 按实际实体条件组合【已实现】
Section titled “5.1.2 按实际实体条件组合【已实现】”exact.boolean.difference 的 base/tool 和 exact.shell 的 solid 输入声明为 ExactBRep,复用 ExactSolid ≤ ExactBRep 的可赋值关系。程序和 STEP 导入的 shape、原生节点的 solid 保持各自实际端口、表示与生产者;不插入转换节点,也不将一般 B-Rep 重标为有效实体。差集与抽壳共同要求输入经内核确认是一个有效实体、没有实体之外的零散面/边/点;单实体 Compound 可进入这一接受域,多实体或非实体不可。
差集仍要求不同操作数、正体积、实际去料及非空单实体结果;抽壳仍要求有限正厚度、绑定同一修订与来源的唯一开口面、有效结果及指定内外侧的体积条件。当前 body 的合格实体共用边选择快照构建,程序/导入的非主实体也可查询和加工;面选择 scope 保留实际 solid | shape 端口;丢失或歧义来源明确失败,不按相似外形补绑。结果输出仍为经过检查的 ExactSolid,可再次作为程序输入。
shell、finish-edges 附带的新建 requirements 默认绑定被加工 body;显式 target 或既有 assertion 的目标优先。独立要求随该 body 的 authority 推进并在后续改参时重新检查,不绑定碰巧处于 main 的另一对象。当前模块、目录与选择 schema 内容哈希同步更新,只维护当前契约。
抽壳的几何检查在维护版 Replicad 的 shellWithFaces 中执行,原生节点和程序共用:有限正容差、有限且绝对值大于容差的 offset、输入/结果 BRepCheck、开口属于源且不重复、原开口面不保留。对于单实体且有开口的输入,结果还须为无零散拓扑的单个正体积实体;向内时结果体积必须小于来源。体积来自同次 OCCT 测量,原生 afterBuild 复用测量值,来源观察只接收通过检查的结果。一般 Shell/Compound 或空开口偏移不被强制为该单实体材料域。
程序 r.shell 的正厚度表示向内、负值表示向外,默认容差 1e-3;shellWithFaces 使用内核 offset 符号,负值向内。原生 AMIR 仍为正 thickness 加显式 side,容差 1e-6;在同一容差、输入与开口集合下才比较对等行为。程序支持多面或空开口,原生计划单选面属于当前表达限制,不是共用内核限制。几何检查不是全局均匀壁厚或无自交的数学证明;修订选择、来源身份、独立要求与原子提交仍各自验证。AMIR schema 未改变;共用 Length/Angle 作者值编码改为无指数的有限十进制,避免小厚度先被字符串编码错误挡住。
5.2 Port
Section titled “5.2 Port”Operation descriptor 定义 input/output Port 的:
- 名称和方向;
- 类型;
- required/optional/variadic;
- 默认值;
- 值域和单位约束;
- 是否影响几何语义、缓存键和模型 hash。
canonical Node 必须显式提供所有 required input。optional input 可以省略,此时 descriptor 中的版本化默认值生效。实现禁止在 adapter 内增加未记录的默认值。
每个 PortRef 必须指向存在的 output Port。Node input 中的 PortRef 按第 5.3 节规则产生 Feature DAG 边。禁止引用同一 Node 的输出作为其输入。
5.3 Dependency Graph 与 Feature DAG 规则
Section titled “5.3 Dependency Graph 与 Feature DAG 规则”Feature DAG 是 canonical Node 及其 PortRef 形成的 Node-to-Node 有向无环子图。Document Dependency Graph 是更广义的静态依赖图,顶点还包括 Parameter、Expression、Constraint、SemanticRef、Assertion、Body,以及每个具名 root binding 的合成顶点 root:<name>。
边方向统一为 dependency -> consumer。实现必须遍历 Document 中每一个规范性 Value、reference 字段,以及 semantic extension 声明为 reference-bearing 的 payload;每发现一个引用,就从被引用对象向包含该引用的消费者添加边,不能只扫描 Node input。至少包括:
- PortRef:目标 Node → 消费该值的 Node、Constraint、SemanticRef、Assertion、Body 或 root;边 metadata 保留 port name;
- ParameterRef / ExpressionRef:目标 Parameter/Expression → 消费者;Expression 内部引用也适用;
- SemanticRefRef / ConstraintRef / BodyRef:目标 SemanticRef、Constraint 或 Body → 消费者;
- SemanticRef 的 scope、source、lineage producer 引用:目标 Node/对象 → SemanticRef;
- Sketch solve 对 Constraint 的消费:Constraint → solve Node;Assertion subject/value:目标对象 → Assertion;
- Body authority PortRef:目标 Node → Body;root binding:Body 或 Assembly producer Node →
root:<name>。
上述规则递归遍历 list、record 和其他 tagged Value。非语义 extension 不产生边;semantic extension 必须随 schema 提供确定性 reference extractor。因而,若 Node 消费某 Body,而该 Body 的 authority 又指回该 Node,图中必然形成可检测循环,各实现不得自行忽略其中一条边。
Feature DAG 与完整 Document Dependency Graph 都必须无环。静态验证器必须在调用几何内核前检测循环,并返回唯一错误码 DEPENDENCY_CYCLE,在 details.graphKind 中写 feature 或 document,同时包含最短可复现 cycle path。
求值顺序必须是 dependency-first 的稳定拓扑序;当多个 Node 同时 ready 时,以 NodeId UTF-8 字节序打破平局。Dirty propagation 沿 dependency -> consumer 正向传播。实现可以并行执行互不依赖的 Node,但并行归约必须满足声明的 determinism class。
Node 失败时,其所有依赖后继必须标记 blocked,不得用上一次成功缓存冒充当前输出。未受影响的 DAG 分支可以继续求值。
5.4 Roots
Section titled “5.4 Roots”roots 是对外发布名称到 BodyRef 或 Assembly PortRef 的 map。Part/body root 应引用 BodyId;Assembly root 可以引用 Assembly output。示例:
{ "main": { "body": "body.main" }}导出、视图和默认选择必须明确指定 root;存在多个 root 时禁止静默选择第一个。DisplayMesh、RenderPacket 和其他 view artifact 不得成为 authoring root。
5.5 Body registry 与权威表示
Section titled “5.5 Body registry 与权威表示”BodyId 是跨 Revision 稳定的逻辑 body 身份,不等同于任何一次执行中的 OCCT shape、Manifold object 或 artifact ID。canonical Body 结构为:
{ "label": "Main body", "authority": { "port": { "node": "n.extrude", "port": "solid" } }, "extensions": {}}规则:
authority必须指向ExactSolid、ExactBRep、MeshSolid或Field3D<K>output;同一个 Body 在一个 Revision 中只能有一个 authority。- Feature DAG 可以保留多个表示候选,但候选不会仅因 conversion 执行成功而自动取得 Body 身份。
- 权威切换必须通过显式
body.setAuthorityPatch,并重新运行适用于新表示的 Assertions。 - 删除 Body 默认不得删除产生其 authority 的 Node;反向删除也必须通过依赖检查。
- Body label 可以改变,但 BodyId 不得复用或由显示顺序推导。
5.6 Operation descriptor
Section titled “5.6 Operation descriptor”Operation Catalog 中每个 descriptor 至少必须包含:
{ "id": "exact.extrude", "version": "1.0.0", "purity": "pure", "inputs": {}, "outputs": {}, "typeRule": "exact.extrude/v1", "preconditions": [], "postconditions": [], "fieldKindRule": null, "kernelCapabilities": ["exact.brep.extrude"], "diagnosticCodes": []}descriptor 必须版本化默认值、类型规则和后置条件。改变结果语义、默认值或 Field kind 传播规则必须提升 Operation major version。
面向 AI 的自然语言摘要、intent examples、taxonomy、检索向量、常见误用和 ranking metadata 不得混入 descriptor 后改变 operation 语义。它们由 RFC-0002 的 AI Capability Profile 独立版本化;每次 AI 任务记录实际 discoveryCatalogHash,但纯 discoverability 更新默认不改变 authoringLockHash。任何参与规范默认值、类型规则、lowering 或结果解释的字段都必须回到本 descriptor,并按本节提升版本。
6. Parameter 与 Expression
Section titled “6. Parameter 与 Expression”6.1 Parameter
Section titled “6.1 Parameter”Parameter 是用户或 AI 可以有意修改的具名输入:
{ "type": "Length", "value": { "const": { "type": "Length", "value": "80", "unit": "mm" } }, "range": { "min": { "const": { "type": "Length", "value": "20", "unit": "mm" } }, "max": { "const": { "type": "Length", "value": "200", "unit": "mm" } }, "minInclusive": true, "maxInclusive": true }, "label": "Width", "mutable": true}Parameter 的 value 必须是同类型 Const,不能引用 Node output。派生值必须使用 Expression。超出 range 的 patch 必须在静态阶段失败,不能交给内核截断。
实现状态:Parameter.type 为 Length | Angle | Count | Int | Real | Ratio | Bool【已实现】;range 只表达连续区间。
【计划】符号参数:AMIR 目前支持“可变的数值”与“不可变的符号”(ConstAtom 已含 PrincipalPlane 等枚举),
但不支持“可变的符号”。具有有限目录域的输入(标准件规格 M8、材料牌号、螺纹标记、型材系列)因此只能以
源码字面量存在,改规格等于改源码。裁决:为 Parameter 增加符号类型与 choices 有限论域,并把程序沙箱的 p
从 Record<string, number> 放宽为带类型值。这是当前唯一卡“可编辑”主张的硬缺口,依据见
审计 §7。
同一缺口的另一面在模型接口侧:合法的 Candidate 句柄与参数论域无法表达进模型看到的工具 schema, 模型因此可以写出不存在的标识符而只能事后被拒,见 RFC-0002 §13.2.1。
6.2 Expression
Section titled “6.2 Expression”【未实现】 当前 Document 没有文档级 expressions 字段;旧恒空占位及其 hash 槽已删除。以下为尚未实现的表达式设计,不是当前契约。
Expression 是无副作用、无递归的有类型表达式 DAG。它可以引用 Const、Parameter 和其他 Expression,但禁止引用几何 Node output、Artifact、时间、环境变量或网络结果。
{ "type": "Length", "body": { "call": "math.mul", "args": [ { "parameter": "p.width" }, { "parameter": "p.aspect" } ] }}Expression Catalog 至少应支持:
math.add、sub、mul、div、neg;math.min、max、clamp、abs;math.sin、cos、tan,输入必须为Angle;logic.and、or、not;compare.eq、lt、lte、gt、gte;select.if,两分支类型必须相同。
Expression evaluator 必须进行量纲代数,例如 Length * Length -> Area、Volume / Area -> Length。除非 Catalog 明确支持,产生非整数次量纲的运算必须拒绝。
Expression graph 必须无环。除固定 Catalog 中的函数外,不允许 lambda、循环、递归或动态函数名。
7. Sketch Constraint 与 Assertion
Section titled “7. Sketch Constraint 与 Assertion”7.1 Sketch Constraint
Section titled “7.1 Sketch Constraint”Constraint 参与 Sketch2D 的几何求解,与只做检查的 Assertion 不同。【节点内实现】 约束在 sketch.constrainedProfile@1.0.0 节点输入中,由 Rust sketch_constrained_profile 校验、PlaneGCS 适配器求解;文档级恒空 constraints 占位已删除。已支持 coincident、horizontal、vertical、parallel、perpendicular、tangent、distance、angle、radius 九种。canonical Constraint 示例:
{ "kind": "sketch.distance", "kindVersion": "1.0.0", "targets": [ { "sketch": { "node": "n.sketchEntities", "port": "sketch" }, "entityId": "edge.left" }, { "sketch": { "node": "n.sketchEntities", "port": "sketch" }, "entityId": "edge.right" } ], "value": { "parameter": "p.width" }, "mode": "driving", "enabled": true}规则:
- Sketch entity 必须有稳定的局部
entityId,不得使用数组索引。 mode为driving时参与求解;为reference时只测量并产生派生值。- driving Constraint 的单位和 target 数量必须由 Constraint Catalog 校验。
- Solver 必须报告剩余 DOF、冗余约束和最小可解释 ConflictSet。
- required driving Constraint 无解时,相关 Sketch Node 必须失败,不得近似忽略。
- 本版不定义模糊的软优先级;需要软约束的扩展必须使用命名空间化 Operation。
MVP Constraint kind 见第 18.4 节。
7.2 Assertion
Section titled “7.2 Assertion”Assertion 不改变几何,只验证静态或运行时条件。【部分实现】 assert.validSolid 的 inputs.solid 引用一个 Exact 节点输出;目标须包含恰好一个不同的 OCCT Solid,且通过当前运行时的 BRepCheck,实体外不得有游离壳、面、线、边或顶点。允许 Compound/CompSolid 容器包装;多实体、单独的面或曲线不满足条件。公共求值器复用各几何生产者已执行的 BRepCheck,通过 Replicad iterTopo 复用 TopExp_Explorer 的 ToAvoid 剪枝,跳过实体内部拓扑并检查游离部分;每次候选或修订求值均执行,结果绑定目标 artifact/contentHash 并纳入几何证据哈希,公开 evaluation.documentAssertions 返回通过项。它是 OCCT 在已有容差与算法设置下的有效性检查,不证明完整设计意图、制造适用性或数学上的全域几何正确性。assert.watertight、assert.manifold 尚未求值,仍返回 EXACT_GRAPH_ASSERTION_UNKNOWN 并阻止认证。severity 固定为 error、onUnknown 固定为 fail;Core 检查声明引用。其余种类与可配置策略【未实现】:
{ "op": "assert.validSolid", "opVersion": "1.0.0", "inputs": { "solid": { "body": "body.main" } }, "severity": "error", "onUnknown": "fail"}severity 为 warning 或 error,onUnknown 为 fail、warn 或 pass(规范目标;当前实现为固定常量);authoritative commit profile 中,安全/制造 Assertion 默认必须使用 fail。Assertion 的结果目标为 pass、fail、unknown 或 notApplicable,并写入 Geometry Certificate;当前 assert.validSolid 成功时记录绑定几何的 pass,不满足实体条件时以结构化错误报告 fail;未实现谓词报告 unknown。fail 和 unknown 均阻止签发通过证书。
Assertion 不得自动修改参数或几何。修复建议只能作为 Diagnostic fix 返回,并由新 Patch 显式应用。
当前 assertion.put、assertion.remove 通过同一原生 Patch 管线写入声明,撤销/重做恢复声明集合。
共享 AI SDK 的 require-solid 步骤由宿主生成 ID 与固定验证策略;可指定已有断言 ID 重新绑定目标,
新声明未指定目标时绑定当前 main 或唯一根的 Body,后续沿该 Body 的 authority 求值;
显式节点端口目标检查固定中间结果。修订已有 ID 时省略目标保留原绑定。
remove-assertions 按公开读取返回的 ID 列表原子撤回指定要求,变更进入修订历史。
声明编辑回执的 requirements 返回当前声明及验证结果,复用既有提交回读,不增加查询。声明编辑本身不改几何,
但候选仍须经过公共求值、验证和原子提交;不满足新声明时保持原头及原声明。
assert.bounds 验证指定 ExactSolid/ExactBRep 输出的世界轴对齐外部边界。inputs.solid 为 {body} 或显式 {port:{node,port}},
inputs.min/max 各含三个独立的毫米 Length 常量,不接受驱动几何的参数引用。比较使用当前文档的
validationDistance:六个声明坐标与原生测量坐标之差的无穷范数不超过该容差时通过。
复用 ArtifactGraph 已有的 OCCT 子形状边界及同一 exactBoundsMaxDeviation 比较;临时 expect.bounds
也使用此比较,没有新增内核测量或从显示网格推断尺寸。这是既有内核数值设置下的外部边界检查,
不证明内孔、壁厚、制造公差或完整设计意图。通过结果绑定目标 artifact,失败返回声明值、实测值、
最大偏差和容差;声明不会随几何参数自动变化。
共享工具的 require-bounds 接受独立请求的 bounds.min/max,目标解析规则同 require-solid:默认绑定当前 main 或唯一根对应的 Body 身份,后续每次求值
跟随该 Body 当前 authority;显式 {node,port} 用于检查固定中间输出。
已有 ID 可显式修订;不提供 ID 时只复用目标和值均相同的声明,不静默覆盖不同要求。
build-program、set-parameters 和两种 replace-program 形式可携带 requirements 数组,
复用相同的 require-solid、require-bounds、remove-assertions 操作定义。创建时省略目标绑定新建 Body;
修订已有声明时省略目标保留原绑定,新声明则默认当前 main 或唯一根的 Body。同一声明 ID 在一次编辑中只能出现一次。
被要求引用的 Body 若被删除,Core 拒绝悬空引用;必须在同一 Patch 显式撤回或重定向这些要求。
几何与要求增删改合入同一 Patch;全部通过才提交,任一失败都保留旧状态,包括新建失败时不留下模型。
例如改参步骤附 requirements:[{kind:"require-bounds",assertionId,bounds}] 同时更新独立尺寸要求。
契约只保留此组合方式,已删除仅支持边界修订的专用字段与编译分支。
使用者不必先撤销要求才能修改产品尺寸或位置。要求编辑回执同样复用提交回读,返回当前声明与检查结果。
8. SemanticRef 与 cardinality
Section titled “8. SemanticRef 与 cardinality”SemanticRef 用来源、角色、谱系和几何谓词解析子形状。它不是内核 index 的别名。【节点内实现】 引用以 exact-face-selector / exact-edge-selector 的形式存在于节点输入,并由独立读 schema 解析;文档级恒空 semanticRefs 占位已删除。
完整 authoring/resolution wire、集合型返回、resolveAcross、evolution 与 hash 合同见
Aira SemanticRef v0.1 契约。Canonical Schema 是
semantic-ref.schema.json;本节定义 AMIR
authoring 语义,该独立契约定义 Evaluation/ArtifactGraph 解析证据。
{ "scope": { "port": { "node": "n.extrude", "port": "solid" } }, "entityType": "Edge", "lineage": { "createdBy": ["n.extrude"], "fromRoles": ["side.from:sketch.edge.outer"] }, "where": { "all": [ { "predicate": "edge.convex", "equals": true }, { "predicate": "edge.parallelTo", "value": { "const": { "type": "Direction3", "value": ["0", "0", "1"] } }, "angularTolerance": { "const": { "type": "Angle", "value": "0.1", "unit": "deg" } } } ] }, "cardinality": { "min": 4, "max": 4 }, "evolutionPolicy": { "onSplit": "descendants", "onMerge": "reject", "onDelete": "reject", "onKindChange": "reject" }, "ordering": "unordered", "onFailure": "error"}解析器必须按以下优先级求交筛选:
- scope 和 producing feature 的历史映射;
- role、generated/modified lineage;
- 拓扑与邻接关系;
- 显式带容差的几何 predicate。
cardinality.min 必须为非负整数;max 为不小于 min 的整数或 null。常见合同为:
- exactly one:
{"min":1,"max":1}; - exactly N:
{"min":N,"max":N}; - non-empty:
{"min":1,"max":null}。
每个 SemanticRef 必须显式声明 evolutionPolicy:
onSplit为reject或descendants;后者允许继续对全部谱系后代应用谓词和 cardinality。onMerge为reject或mergedResult;后者允许把合并结果作为候选,但仍必须满足谓词和 cardinality。onDelete为reject或allowMissing;allowMissing仅在cardinality.min=0时合法。- 本版的
onKindChange必须为reject。
Evolution policy 不是跳过查询的捷径。每次跨 Revision 解析仍必须重新应用完整 lineage、拓扑、几何谓词与 cardinality,并把 split/merge/delete 及最终决策写入 resolution trace。
候选数小于 min 时必须返回 SEMANTIC_REF_MISSING;大于 max 时必须返回 SEMANTIC_REF_AMBIGUOUS。禁止在 cardinality 失败时选第一个候选继续执行。
本版的 onFailure 必须是 error。可选引用应通过 cardinality.min=0 表示;下游若不能接受空 EntitySet,仍必须产生类型或前置条件失败。
当下游 Operation 需要有序列表时,SemanticRef 必须声明确定性 ordering,例如 byRoleThenCentroidLexicographic,并明确坐标系和容差。unordered 的 EntitySet 禁止赋给顺序有语义的 List<Entity> Port。
SemanticRef 解析结果只在特定 Revision、Evaluation/ArtifactGraph 和 ExecutionManifest 下有效;跨 Revision
或跨表示 context 的身份必须通过 ArtifactGraph lineage/translation evidence 的 resolveAcross 重新解析。
同一 Revision 的 Exact/Mesh context 仍是两个不同 context。当前/跨 context 结果都必须返回完整
candidates[]、declared/actual cardinality、七阶段 trace 和 evolution;禁止把裸 subshape id 作为结果,
也禁止在 missing/ambiguous/changed-kind/unknown 时采用第一个候选。
9. 表示转换、误差合同与 Kernel hints
Section titled “9. 表示转换、误差合同与 Kernel hints”9.1 转换必须是 Node
Section titled “9.1 转换必须是 Node”以下转换可以进入 MVP,但必须显式存在于 Feature DAG:
| Operation | 输入 | 输出 | 必需误差/采样参数 |
|---|---|---|---|
convert.exactToMesh |
ExactSolid |
MeshSolid |
chordal deviation、angular deflection、minimum segment length |
convert.fieldToMesh |
Field3D<K> |
MeshSolid |
bounds、iso value、max cell/edge length、root tolerance |
convert.meshToField |
MeshSolid |
Field3D<GeneralImplicit> 或更强 |
voxel size、band width、sign method、domain |
默认禁止:
MeshSolid -> ExactSolid自动重建;Field3D -> ExactSolid泛化转换;DisplayMesh ->任意权威表示;- 未声明误差的隐式 tessellation、voxelization 或 remesh。
Exact/Mesh/Field 到 DisplayMesh 的 tessellation、LOD 和 preview 是 runtime view job,不是 AMIR Feature Node。它们由 EvaluationId、view quality profile 与 source artifact hash 定址,不进入 modelHash。Export 同样是绑定 Revision/Evaluation 与 delivery profile 的派生 job;本版不定义 canonical export node。
9.2 误差合同
Section titled “9.2 误差合同”有损转换 Node 必须包含 errorBudget record。适用字段包括:
maxChordalDeviation: Length;maxAngularDeviation: Angle;maxHausdorffDistance: Length;maxCellSize: Length;rootTolerance: Length;requireBoundedError: Bool。
Operation descriptor 必须声明每个字段是可证明上界、估计值还是仅执行参数。Geometry Certificate 必须区分:
provenUpperBound;measuredEstimate;requestedOnly;unknown。
若 requireBoundedError=true 而执行器无法给出所需上界,必须失败为 ERROR_BOUND_UNAVAILABLE。若已知上界超过预算,必须失败为 ERROR_BUDGET_EXCEEDED,不得只给 warning 后提交。
转换产生新的 output,不会改变原表示。Body 的权威表示只有在显式 body.setAuthority Patch 中才会切换;root.put 只发布 BodyId 或 Assembly output,不承担权威切换。
Canonical translation evidence、loss certificate、source→target mapping、claim-level 与 false-pass 规则见
Representation Translation v0.1。当前真实 ExactSolid→MeshSolid Gate
刻意把 OCCT face deflection 标为 measuredEstimate、angular 参数标为 requestedOnly;它们不得被提升为
provenUpperBound。
Field3D→MeshSolid 的最小合同和真实 Manifold level-set 证据见 Field IR v0.1。当前
adapter 只接受 Field3D<TrueSDF>,把 Aira 负内场取反后交给正内 kernel;GeneralImplicit 在 root-distance
语义确定前 fail closed。它不提供 global Hausdorff bound,也不产生 face-level SemanticRef identity。
Field translation 0.2.0 已分别绑定 source/target Revision、Evaluation、ExecutionManifest、ArtifactGraph 与
artifact locator;Field 图用 ScalarField/Region 表示零面语义域,Mesh target 在 survival 未知时发布零个
Face。两图内部 derivation 仍严格 representation-local。
9.3 Kernel requirements 与 hints
Section titled “9.3 Kernel requirements 与 hints”Node 可以包含:
{ "kernelRequirements": { "capabilities": ["exact.brep.extrude"], "determinismAtLeast": "geometricWithinTolerance" }, "kernelHints": { "preferred": ["occt-wasm"], "execution": "worker", "maxTimeMs": 5000, "maxMemoryMiB": 512 }}kernelRequirements 是执行前置条件;不满足时必须失败。kernelHints 是非语义偏好,可以忽略,但执行结果仍必须满足相同类型、后置条件和显式误差合同。
任何会改变几何语义、容差、分辨率、Field kind 或随机性的选项必须是普通 input/settings,不能藏在 hint 中。最终选择的 kernel ID、完整版本、构建 hash、编译特性和 fallback 路径必须写入 Geometry Certificate。