feat: close hidden link property evidence
This commit is contained in:
129
后续工作.txt
129
后续工作.txt
@@ -5337,3 +5337,132 @@ git diff --check
|
||||
- SQLite OPFS save/load、version 2 checkpoint 和 recovery integrity `ok` 均恢复完整 `IncludedFileValue` 与 `App::PropertyFileIncluded` TypeId;浏览器内 FCStd 检查确认 `FileIncluded file="chrome-resource.bin"`、16 bytes 内嵌 entry 与目标字节逐项一致。
|
||||
- 文档资源按 SHA-256 回读为同一 16 bytes;独立 48 bytes 资源的 put/get/release 后读取为 null,OPFS marker 已创建并删除。Worker 请求覆盖 initialize/save/load/checkpoint/recovery/resource/dispose,最终 persistence Worker 已 terminate。
|
||||
- 最终 `shapeCount=0`、`kernelReferenceCount=0`;`test/check:chrome-property-fileincluded`、E/F focused test、G checker、生产 `build`、JSON 校验与 `git diff --check` 均通过,H 阶段机器证据已加入连续账本。
|
||||
|
||||
## 23. 2026-08-17 接续执行记录
|
||||
|
||||
### `PROP-app-propertyintegerset-A..H` 接续审计
|
||||
|
||||
#### 执行过程与完成证据
|
||||
|
||||
- 接续时发现已提交的连续进度账本包含 `PROP-app-propertyintegerset-A..H`,但活动队列仍停在 A;`check:freecad-active-work-queue` 按预期以 stale 失败,没有把过期队列误当成当前真值。
|
||||
- 逐项复核 A-H 已有证据:原生清册锁定 2 条可写宿主;成功探针锁定去重、排序、空集合、负数、标量和最大安全整数;失败探针锁定类型拒绝、Immutable/ReadOnly 与事务回滚;变异探针锁定两个 FEM 宿主的编辑/恢复。
|
||||
- Facade 与事务测试确认 Web 值模型为排序、唯一的安全整数数组,原生 FCStd payload 为 `IntegerSet`;stale、cancel、非法值和资源指标均零污染。真实 FreeCAD 往返保持 `[-1,8]` 且零未知漂移,Chrome SQLite OPFS/Worker 回放恢复相同值并释放资源和 Worker。
|
||||
- A、B、C、D、E、F、G、H 及 promotion 九个 focused gate 全部通过;重建机器队列后恢复为单一活动任务 `PROP-app-propertyintegerset-I`,未改写既有原生或浏览器证据。
|
||||
|
||||
### `PROP-app-propertyintegerset-I`
|
||||
|
||||
#### 执行过程与完成证据
|
||||
|
||||
- promotion checker 逐项核对 A-H 连续账本、2 条原生宿主、排序唯一安全整数数组、`IntegerSet` FCStd payload、真实 FreeCAD 往返和 Chrome OPFS/Worker 释放证据。
|
||||
- `App::PropertyIntegerSet` 已从 `opaque-fcstd-proxy` 提升为 `native-editable-codec`;全局快照保持 `34 / 4370 native-editable`、`46 / 457 opaque`,exact blocker 仍为剩余 46 个 opaque Property 类型,系统 exact 保持 false。
|
||||
- 原生绑定对从未赋值的空集合读取会终止进程;Facade 使用“先赋空数组再读取”的安全等价边界,没有把该原生缺陷隐藏成普通成功路径。
|
||||
- `check:freecad-property-integerset-promotion` 通过,I 阶段证据已加入连续账本;下一步重建活动队列并直接接领新的唯一 `nextTask`。
|
||||
|
||||
### `PROP-app-propertylinklisthidden-A`
|
||||
|
||||
#### 执行过程与完成证据
|
||||
|
||||
- 从锁定 FreeCAD 1.1.1 桌面 oracle 确认仅有 `Sketcher::SketchObject.Exports` 与 `Sketcher::SketchObjectPython.Exports` 两条记录;两者均可实例化、默认空列表、分组为 Sketch,原生状态位 26 解码为 `PropHidden`。
|
||||
- 将属性状态 `PropHidden` 与类型的 `LinkScope::Hidden` 分开锁定:前者隐藏普通属性编辑入口,后者使链接不建立 backlink、默认 `getLinks()` 和 DAG 依赖,但 `getLinks(all=true)` 仍可枚举。
|
||||
- 源码合同确认该类型继承 `App::PropertyLinkList`,只接受已挂接的同文档对象列表,空列表或单 null 列表清空;未开启外部链接标志时拒绝跨文档对象。列表顺序与重复项保留,持久化仍使用 `LinkList/Link`。
|
||||
- Sketch 的 Exports 用于按对象名解析导出子对象,并兼容从旧 `App::PropertyLinkList` 归档恢复;属性写入本身不要求 Shape。
|
||||
- 新增 `generate/check:freecad-property-linklisthidden-inventory`,同时锁定 runtime 与四份 FreeCAD 源码的字节数和 SHA-256;生成器、focused checker、脚本语法、JSON 与 package 清单均通过。A 阶段仍保持 `opaque-fcstd-proxy`,真实 setter、回链/依赖、错误边界和宿主行为留给 B/C。
|
||||
|
||||
### `PROP-app-propertylinklisthidden-B`
|
||||
|
||||
#### 执行过程与完成证据
|
||||
|
||||
- 对 `Sketcher::SketchObject.Exports` 与 `Sketcher::SketchObjectPython.Exports` 运行真实 FreeCAD 1.1.1 setter;先显式赋空列表再读取,覆盖单对象、有序双对象、重复对象和恢复空列表。
|
||||
- 两个宿主都原样保留 `[ExportB, ExportA]` 顺序及 `[ExportA, ExportB, ExportA]` 重复项;属性状态稳定为 `26 / PropHidden`,editor mode 为 Hidden。
|
||||
- 所有阶段的宿主 `OutList` 与两个目标的 `InList` 均为空,锁定 `LinkScope::Hidden` 不泄漏普通 DAG/backlink;对象集始终为一个 Sketch 与两个 Part Feature。
|
||||
- 两个空 Sketch 始终是 Valid、Up-to-date 的 Null Shape;目标 box/cylinder 分别保持 1 solid 与稳定 BREP hash,没有用伪 Shape 替代链接成功证据。
|
||||
- `probe/check:freecad-property-linklisthidden-success`、A checker、脚本语法、JSON 和 `git diff --check` 均通过;B 阶段证据已加入连续账本。
|
||||
|
||||
### `PROP-app-propertylinklisthidden-C`
|
||||
|
||||
#### 执行过程与完成证据
|
||||
|
||||
- 字符串/整数的标量和列表元素分别以精确 TypeError 原子拒绝;跨文档对象以 `PropertyLinkList does not support external object` 的 ValueError 拒绝。五个 case 都保持 `[ExportA, ExportB]`、对象集、Shape hash、OutList/InList 和宿主状态不变。
|
||||
- 首次原生探针发现该类型不能套用普通属性的只读假设:叠加 editor ReadOnly 后 Python setter 仍写成 `[ExportB]`;叠加 property Immutable 后也仍成功写入。两项均作为 `python-setter-accepted` 原生边界保留,没有伪造拒绝结果。
|
||||
- 开启 `UndoMode=1` 后,活动事务把列表改成 `[ExportB, ExportA, ExportB]`;abort 恢复原值但宿主暂为 Touched,随后一次原生 recompute 返回 Up-to-date/Valid,隐藏依赖、目标 Shape 与对象集全程不变。
|
||||
- setter 没有 native cancel hook,取消合同固定为 abort 活动 Document transaction;pending/active transaction 最终归零,外部文档对象也未污染。
|
||||
- `probe/check:freecad-property-linklisthidden-failure`、B checker、脚本语法、JSON 和 `git diff --check` 均通过;C 阶段证据已加入连续账本。
|
||||
|
||||
### `PROP-app-propertylinklisthidden-D`
|
||||
|
||||
#### 执行过程与完成证据
|
||||
|
||||
- 对 `Sketcher::SketchObject` 和 `Sketcher::SketchObjectPython` 分别执行 `[ExportA, ExportB] -> [ExportB, ExportA, ExportB] -> [ExportA, ExportB]`,真实覆盖顺序变化与重复项。
|
||||
- 两个宿主在每次 setter 后都由 Up-to-date/Valid 进入 Touched,原生 recompute 后返回 Up-to-date/Valid;最终 value 与完整 semantic snapshot 精确恢复。
|
||||
- 五个阶段中的属性 TypeId、Sketch 分组、`26 / PropHidden`、Hidden editor mode、Null Sketch Shape、box/cylinder 拓扑与 BREP hash、对象集均保持稳定。
|
||||
- owner OutList 与 target InList 全程为空,证明参数变异和恢复不会临时泄漏普通 DAG/backlink。
|
||||
- `probe/check:freecad-property-linklisthidden-mutation`、C checker、脚本语法、JSON 与 `git diff --check` 均通过;D 阶段证据已加入连续账本。
|
||||
|
||||
### `PROP-app-propertylinklisthidden-E`
|
||||
|
||||
#### 执行过程与完成证据
|
||||
|
||||
- 将 `App::PropertyLinkListHidden` 加入 typed Facade,复用有序字符串链接数组但保留独立 TypeId;setter 校验所有目标都属于当前文档,顺序和重复项不归一化,非法类型和未知目标在事件/版本变化前拒绝。
|
||||
- 依赖收集器仅为普通 `PropertyLinkList` 生成边,Hidden 类型明确保持零依赖;成功写入仍按原生行为将宿主标脏并进入统一事务事件路径。
|
||||
- FCStd writer 为 `Sketcher::SketchObject.Exports` 与 `Sketcher::SketchObjectPython.Exports` 写出静态原生 `PropertyLinkListHidden + LinkList/Link`,保留 `PropHidden` mask,不携带动态 `group/doc/attr/ro/hide` 元数据;decoder 恢复完整有序重复列表。
|
||||
- 两个 Sketch TypeId 均进入 recognized/static host 清册;生产 PropertyPanel 已按 `isFreecadPropertyHidden(nativeStatus)` 过滤该属性,不暴露普通 UI 编辑入口,程序化修改只能走 Facade。
|
||||
- focused test、完整 `test:facade` 199 项、A-D checker、生产 `build`、JSON 与 `git diff --check` 均通过;构建仅保留既有 OCCT 模块 externalized 与大 chunk 警告。E 阶段证据已加入连续账本。
|
||||
|
||||
### `PROP-app-propertylinklisthidden-F`
|
||||
|
||||
#### 执行过程与完成证据
|
||||
|
||||
- 通过公开 Facade 将 Exports 从 `[ExportA, ExportB]` 改为 `[ExportB, ExportA, ExportB]`;一次提交只产生同一 transaction ID 的 `before-change -> changed -> committed`,版本 `1 -> 2`、dirty 与宿主 touched 状态正确。
|
||||
- setter、文档快照和 history 均深拷贝字符串数组;调用方和读取方后续变异不会污染存储值。undo 精确恢复原列表/版本 1,redo 恢复重复有序列表/版本 2。
|
||||
- stale 版本、预取消、未知目标和非字符串元素均在提交前 fail-closed;文档 JSON、事务事件数与 undo/redo 可用性零污染。
|
||||
- 成功、undo/redo 和全部失败路径中的 dependency edges 始终为空,未把 Hidden 链接提升为普通 DAG;Shape 数、内核引用与释放计数完全不变,并显式 dispose 项目持久化边界。
|
||||
- `test:freecad-property-linklisthidden-transaction`、E focused test、JSON 与 `git diff --check` 均通过;F 阶段证据已加入连续账本。
|
||||
|
||||
### `PROP-app-propertylinklisthidden-G`
|
||||
|
||||
#### 执行过程与完成证据
|
||||
|
||||
- 新增受限 `rewriteFcstdLinkListHiddenProperty` 并经公开 Facade `project.fcstd.rewriteLinkListHidden` 暴露;只允许 `Sketcher::SketchObject/SketchObjectPython.Exports`,写前校验对象、属性 TypeId、所有同归档目标和可选旧值,写后重新 inspect 精确闭环。
|
||||
- 真实 FreeCAD 1.1.1 链路创建 `Exports=[ExportA,ExportB]`,Web 直改为 `[ExportB,ExportA,ExportB]`;FreeCAD reopen/recompute/saveAs/reopen 均精确保留新顺序与重复项,宿主仍为 Hidden、Valid、Up-to-date 的 Null Shape。
|
||||
- 原生基线确认 Hidden link 的运行时 `OutList/InList` 始终为空,但 FCStd 加载顺序表仍含目标名:Web 编辑原样保留初始 `[ExportA,ExportB]`,原生再保存后规范化为 `[ExportB,ExportA,ExportB]`。探针分别锁定两层语义,未把 FCStd 加载依赖误判为运行时 DAG。
|
||||
- 两个目标 box/cylinder 的对象集、拓扑、面积、体积及三阶段 BREP SHA-256 全部稳定;除 `Document.xml` 外 4 个 opaque 条目逐字节不变,排除目标属性后的语义对象不变。
|
||||
- `probe/check:freecad-property-linklisthidden-roundtrip`、focused Facade test、TypeScript noEmit 与生产 `build` 均通过,`zeroUnknownDrift=true`;G 阶段证据已加入连续账本。
|
||||
|
||||
### `PROP-app-propertylinklisthidden-H`
|
||||
|
||||
#### 执行过程与完成证据
|
||||
|
||||
- 新增独立真实 Chrome `PropertyLinkListHidden` harness,直接挂载生产 `PropertyPanel` 与 `createProductionFacade`;为此只把既有面板函数导出,没有复制或绕开生产过滤逻辑。
|
||||
- 面板用可见 `Label` 控件证明已正常渲染,而 `Exports` 在程序化修改前后均为 0 个控件、0 次可见文字;`PropHidden` 状态有效,没有把该属性误暴露为普通编辑器。
|
||||
- 通过同一生产 Facade 将隐藏列表从 `[ExportA,ExportB]` 改为 `[ExportB,ExportA,ExportB]`;版本 `1 -> 2`、dirty/touched 正确,运行时依赖始终为 0,通知错误为空。
|
||||
- SQLite OPFS save/load、version 2 checkpoint 和 recovery integrity `ok` 均恢复完整有序重复列表及 `App::PropertyLinkListHidden` TypeId;浏览器内 FCStd 检查确认 `LinkList` payload、`67108864 / PropHidden` 与目标列表完全一致。
|
||||
- Worker 请求覆盖 initialize/save/load/checkpoint/recovery/resource/dispose;44 bytes 独立资源 put/get/release 后读取为 null,OPFS marker 已创建并删除,最终 persistence Worker terminate、`shapeCount=0`、`kernelReferenceCount=0`。
|
||||
- `test/check:chrome-property-linklisthidden`、E/F focused test、生产 `build`、TypeScript noEmit、JSON 与脚本语法均通过;H 阶段证据已加入连续账本。
|
||||
|
||||
### `PROP-app-propertylinklisthidden-I`
|
||||
|
||||
#### 执行过程与完成证据
|
||||
|
||||
- 将 `App::PropertyLinkListHidden` 纳入全局 native-editable codec 分区;原生语义清册现为 35 种/4372 条 native-editable、5 种/683 条 specialized、45 种/455 条 opaque,15 类 status 仍全部有类型化 Facade 行为。
|
||||
- promotion 报告逐项锁定 A-H 连续账本、2 条可写记录、2 个 Sketch 宿主、`PropHidden` 属性状态、`LinkScope::Hidden` 运行时零依赖、`LinkList` FCStd 元素、有序重复值和 Web 隐藏面板过滤。
|
||||
- G 阶段 FreeCAD-Web-FreeCAD 往返 `zeroUnknownDrift=true`,H 阶段 Chrome Worker/OPFS/FCStd/资源释放证据通过;旧有 acceleration、area、boollist、color、colorlist、direction、file、fileincluded、font、force、heatflux、integerset promotion 报告同步到同一 blocker 计数。
|
||||
- exact parity blocker 已从 `46 types/457 records` 更新为 `45 types/455 records`;`systemExact=false` 仍明确表示剩余 opaque 类型未全部完成,未将局部提升误报为全局 exact。
|
||||
- `probe/check:freecad-native-property-semantics`、全部 13 个 promotion checker(含本 I)、focused Facade/transaction、Chrome checker、生产 `build`、JSON 与 `git diff --check` 均通过;I 阶段证据已加入连续账本,机器队列随后进入下一个能力。
|
||||
|
||||
### `PROP-app-propertylinksubhidden-A`
|
||||
|
||||
#### 执行过程与完成证据
|
||||
|
||||
- 从锁定 FreeCAD 1.1.1 runtime oracle 确认 4 条记录:`App::Link.ColoredElements`、`App::LinkGroup.ColoredElements`、`App::LinkPython.ColoredElements`、`App::LinkGroupPython.ColoredElements`。
|
||||
- 四条记录均为可用宿主,分组为 ` Link`,默认 `null`,状态为 `LockDynamic + PropHidden`;继承 `App::PropertyLinkSub`,接受同文档对象与有序子元素名称,空子列表/空对象清空,跨文档和 detached 对象拒绝。
|
||||
- 源码合同锁定专用 `PropertyLinkSubHidden` 的 `LinkScope::Hidden`:普通 `getLinks`、backlink 和 DAG 排除,`getLinks(all=true)` 仍可枚举;FCStd 使用 `LinkSub/Sub`,Draft Link 扩展动态添加并隐藏 `ColoredElements`。
|
||||
- 新增 `generate/check:freecad-property-linksubhidden-inventory`,runtime 与 `PropertyLinks.h/.cpp`、`Link.h`、Draft `draftlink.py` 字节数和 SHA-256 provenance 均锁定,4 条记录与类型合同 checker 通过。A 阶段证据已加入连续账本。
|
||||
|
||||
### `PROP-app-propertylinksubhidden-B`
|
||||
|
||||
#### 执行过程与完成证据
|
||||
|
||||
- 真实 FreeCAD 1.1.1 对 `App::Link`、`App::LinkGroup`、`App::LinkGroupPython`、`App::LinkPython` 四个宿主执行 `ColoredElements=(ColorSourceA,[Face1,Face3])`、重复子元素、空子列表和 `None` 清空。
|
||||
- 四宿主均精确保留有序子元素与重复项;空子列表原生语义是“整对象引用”,不是清空,直接赋 `None` 才清空。属性 TypeId、`LockDynamic + PropHidden`、Hidden editor mode 和对象集稳定。
|
||||
- LinkGroup 两类无普通边;Link/LinkPython 的 `LinkedObject=ColorSourceA` 仅产生其自身既有 OutList/InList,隐藏 ColoredElements 未额外增加依赖/backlink;两个目标 box/cylinder 拓扑和 BREP hash 全阶段稳定。
|
||||
- 新增 `probe/check:freecad-property-linksubhidden-success`,四宿主、ordered/duplicates/wholeObject/explicitNull 四阶段全部通过;B 阶段证据已加入连续账本。
|
||||
|
||||
Reference in New Issue
Block a user