feat: align FreeCAD property status semantics
Some checks failed
real-verification / chrome (push) Has been cancelled
real-verification / freecad-oracle (push) Has been cancelled
real-verification / wasm (push) Has been cancelled

This commit is contained in:
2026-08-14 17:56:41 -04:00
parent f64b78865c
commit e3373c9d6c
28 changed files with 811 additions and 61 deletions

View File

@@ -1,6 +1,6 @@
{
"schemaVersion": 1,
"generatedAt": "2026-08-11T04:50:53.969Z",
"generatedAt": "2026-08-14T14:24:04.328Z",
"status": "pass",
"browsers": [
{
@@ -38,7 +38,7 @@
"height": 579,
"geometrySource": "bitbybit-occt"
},
"screenshotBytes": 128023,
"screenshotBytes": 121616,
"pageErrors": []
}
]

View File

@@ -1,6 +1,6 @@
{
"schemaVersion": 1,
"generatedAt": "2026-08-11T02:37:40.468Z",
"generatedAt": "2026-08-14T14:26:21.996Z",
"browserId": "chrome",
"status": "pass",
"browser": {
@@ -423,18 +423,18 @@
"screenshots": {
"desktop": {
"path": "fixtures/chrome-app-e2e/desktop-workspace.png",
"byteLength": 108743,
"sha256": "dd67ab23283ffd55dc0509174f8636eac5344de581d4cacfff13cc1828617399"
"byteLength": 109165,
"sha256": "f5030d4e3ae88107e06a5e8147a196b5f0eb7748c7c306b4118f97a98dd9bee4"
},
"cam": {
"path": "fixtures/chrome-app-e2e/cam-workbench.png",
"byteLength": 118389,
"sha256": "c339e4b998b8ce7b3290c32efeffebed85dbd1d56d8ae9f764196c7b52e80a8f"
"byteLength": 118390,
"sha256": "5349262af666380bbc96f2932eed2613547ae60870a1d8b9fe44d8ed4831b4ab"
},
"mobile": {
"path": "fixtures/chrome-app-e2e/mobile-start.png",
"byteLength": 130371,
"sha256": "9d69c9e9ced4b45bbd083a37a94b5df074e8d60540c0857e79b9df08a8648d81"
"byteLength": 130361,
"sha256": "c65c8644728cb488b22d683a3b68b770dccdfe2107dc9ab5413bfdda72ff9ab1"
}
},
"pageErrors": []

View File

@@ -30,7 +30,7 @@
"scale": {
"components": 1000,
"bomRows": 10,
"durationMs": 6.685000061988831,
"durationMs": 11.384999990463257,
"budgetMs": 1000
},
"fcstd": {
@@ -44,7 +44,7 @@
"persistence": {
"mode": "sqlite-opfs",
"byteLength": 980,
"hash": "93bbadc1517ccf2443c74578e92bea6d13c01b02976a53630707f5e7002a6066",
"hash": "5482e205a876ef4516106d3819ee59a6873ada3f6e48d85df78ed123c073fd3b",
"roundTrip": true,
"released": true
},

View File

@@ -24,7 +24,7 @@
"persistence": {
"mode": "sqlite-opfs",
"byteLength": 848,
"hash": "7a55c8b5c5f1f5354c2819c6289c9ae60351f7c0d6d1844e51eea2785ce7fad8",
"hash": "ec7b7361b0ea5caad7776e5cf851909745150e0de004840187ce000d268794e0",
"roundTrip": true,
"released": true
},

View File

@@ -1,6 +1,6 @@
{
"schemaVersion": 1,
"status": "pass",
"status": "failed",
"stages": [
"CAD",
"OCL",
@@ -29,15 +29,7 @@
"hasC359": true,
"hasC361": true
},
"machine": {
"backend": "linuxcnc-wasm",
"status": "accepted",
"dryRunStatus": "dry-run",
"parserAuthority": "linuxcnc-wasm",
"lines": 65,
"blocks": 138,
"trajectorySegments": 48
},
"error": "Error: LinuxCNC WASM bridge timed out waiting for parser/controller acceptance.\n at http://127.0.0.1:5201/src/facade/camPipeline.ts:103:18",
"browserId": "chrome",
"browser": {
"product": "150.0.7871.128",

View File

@@ -21,7 +21,7 @@
"multiAxis": true
},
"geometry": {
"sourceShape": "shape-msjl38sz-1",
"sourceShape": "shape-mst1ison-1",
"valid": true,
"volume": 30
},

View File

@@ -153,7 +153,7 @@
},
"facadeCapabilities": {
"geometry": { "level": "experimental", "provider": "BitBybit OCCT 1.1.1", "operations": ["box", "cylinder", "sphere", "cone", "placement", "object-placement-recompute", "placement-validation", "mirror-plane", "mirrored-whole-shape", "multi-transform-whole-shape", "union", "cut", "intersection", "part-primitive-recompute", "part-boolean-recompute", "shape-check", "pad", "pocket", "pocket-through-all", "revolution", "loft", "pipe", "fillet", "chamfer", "linear-pattern-whole-shape", "polar-pattern-whole-shape", "hole-basic-origin-normal", "feature-shape-cache", "face-edge-vertex-topology", "native-cross-feature-history-routing", "step-export", "stl-export"], "featureLevels": { "pad": { "level": "compatible", "exactBlockedBy": ["native MappedNameRef/StringHasher evidence when provider omits it"] }, "pocket": { "level": "compatible", "exactBlockedBy": ["native MappedNameRef/StringHasher evidence when provider omits it"] }, "revolution": { "level": "compatible", "exactBlockedBy": ["native MappedNameRef/StringHasher evidence when provider omits it"] }, "groove": { "level": "compatible", "exactBlockedBy": ["native MappedNameRef/StringHasher evidence when provider omits it", "OCCT/FreeCAD private token generation"] }, "boolean": { "level": "compatible", "exactBlockedBy": ["native MappedNameRef/StringHasher evidence when provider omits it", "isomorphic source ambiguity"] }, "fillet": { "level": "experimental", "exactBlockedBy": ["complete cross-feature native stage history"] }, "chamfer": { "level": "experimental", "exactBlockedBy": ["complete cross-feature native stage history"] }, "multi-transform": { "level": "experimental", "exactBlockedBy": ["feature-list native history", "private naming tokens"] } } },
"document": { "level": "experimental", "operations": ["typed-properties", "property-vector", "property-placement", "property-multi-transform", "property-link-list", "property-string-list", "property-link-sub", "expressions", "units", "dependency-dag", "parallel-level-recompute", "sync-recompute", "async-generation-recompute", "root-cause-diagnostics", "repair-branch-recompute", "versioned-toporef", "toporef-migration", "generation-topology-snapshot", "linksub-external-geometry-migration", "ambiguous-deleted-topology-diagnostics", "adjacency-fingerprint-disambiguation", "toporef-candidate-replacement-transaction", "signature-topology-history-fallback", "native-topology-history-adapter", "native-cross-feature-history-routing", "runtime-mapped-name-ref-evidence", "string-hasher-evidence-validation", "element-map2-multi-stage-name-mapping", "isomorphic-candidate-persistence", "element-map-name-contract", "undo-redo"] },
"document": { "level": "experimental", "operations": ["typed-properties", "property-vector", "property-placement", "property-multi-transform", "property-link-list", "property-string-list", "property-link-sub", "freecad-property-status-bitmask", "property-status-native-oracle", "property-status-output-touch-suppression", "property-status-dependent-only-recompute", "property-status-transient-fcstd", "property-status-no-persist-fcstd", "expressions", "units", "dependency-dag", "parallel-level-recompute", "sync-recompute", "async-generation-recompute", "root-cause-diagnostics", "repair-branch-recompute", "versioned-toporef", "toporef-migration", "generation-topology-snapshot", "linksub-external-geometry-migration", "ambiguous-deleted-topology-diagnostics", "adjacency-fingerprint-disambiguation", "toporef-candidate-replacement-transaction", "signature-topology-history-fallback", "native-topology-history-adapter", "native-cross-feature-history-routing", "runtime-mapped-name-ref-evidence", "string-hasher-evidence-validation", "element-map2-multi-stage-name-mapping", "isomorphic-candidate-persistence", "element-map-name-contract", "undo-redo"] },
"persistence": { "level": "experimental", "provider": "SQLite WASM + OPFS with transient fallback", "operations": ["schema-v7", "stable-native-object-tags", "object-topology-snapshots", "transactional-migrations", "migration-rollback", "serialized-write-queue", "five-version-checkpoints", "checkpoint-load", "recovery-report", "content-addressed-resources", "quota-preflight", "resource-sweep-plan", "opfs-orphan-sweep", "cross-tab-lock-notice"] },
"sketcher": { "level": "experimental", "provider": "typescript-basic; FreeCAD 1.1.1 planegcs WASM core installed", "operations": ["point-line-circle-arc-model", "ellipse-bspline-periodic-model", "construction-geometry", "geometry-validation", "stable-geometry-signature", "stable-external-geometry-model", "basic-constraints", "advanced-constraint-proxy", "diameter-symmetric-tangent", "basic-solver", "versioned-solver-protocol", "solver-capability-probe", "cancel-stale-isolation", "replay-contract", "planegcs-native-system-solve", "planegcs-horizontal-distance", "planegcs-vertical-distance", "planegcs-distance-x", "planegcs-distance-y", "planegcs-angle", "planegcs-circle-radius", "planegcs-circle-diameter", "planegcs-equal-lines", "planegcs-equal-circles", "planegcs-tangent-circles", "planegcs-point-symmetry", "planegcs-point-on-object", "planegcs-point-on-arc", "planegcs-point-on-ellipse", "planegcs-point-on-cubic-bspline", "planegcs-block-freeze", "planegcs-parallel-lines", "planegcs-perpendicular-lines", "planegcs-coincident-lines", "planegcs-snells-law-lines", "planegcs-ellipse-internal-alignment", "planegcs-cubic-bspline-weight", "planegcs-dedicated-worker-smoke", "persistence"] },
"fcstd": { "level": "read-only", "operations": ["zip-preflight", "document-xml-metadata", "document-property-projection", "live-topology-element-map", "proxy-report", "script-isolation"] },

View File

@@ -862,9 +862,6 @@
],
"facadeNative": [
"Hidden",
"ReadOnly"
],
"proxyOnly": [
"Immutable",
"LockDynamic",
"NoModify",
@@ -877,17 +874,39 @@
"PropOutput",
"PropReadOnly",
"PropTransient",
"ReadOnly",
"Transient"
],
"proxyOnlyRecordCount": 2639,
"behaviorNative": [
"Hidden",
"Immutable",
"NoModify",
"Ordered",
"Output",
"PropHidden",
"PropNoPersist",
"PropNoRecompute",
"PropOutput",
"PropReadOnly",
"PropTransient",
"ReadOnly",
"Transient"
],
"preservedOnly": [
"LockDynamic",
"PartialTrigger"
],
"preservedOnlyRecordCount": 70,
"proxyOnly": [],
"proxyOnlyRecordCount": 0,
"unknownNumericBits": []
},
"harness": {
"path": "scripts/run-freecad-native-property-semantics.mjs",
"bytes": 5658,
"sha256": "35eb62dc7988ac5f373fb25d1558ab830ecb42b261009fbd79638ee428800331"
"bytes": 5949,
"sha256": "fb7fb74e4979b284e7a0f637d820bd183cea8e5cfb1348fd1730a891ac1306a2"
},
"exactPromotionReady": false,
"exactBlocker": "complete native document and property semantics",
"generatedAt": "2026-08-14T12:20:59.613Z"
"generatedAt": "2026-08-14T15:36:12.139Z"
}

View File

@@ -0,0 +1,223 @@
{
"baselineId": "freecad-1.1.1-property-status-oracle",
"cases": [
{
"afterRecompute": {
"documentTouched": false,
"mustExecute": false,
"state": [
"Up-to-date"
]
},
"attr": 0,
"before": {
"documentTouched": false,
"mustExecute": false,
"state": [
"Up-to-date"
]
},
"changed": {
"documentTouched": true,
"mustExecute": false,
"state": [
"Touched"
]
},
"id": "ordinary",
"recomputeCount": 1,
"reportedStatus": [
"21"
],
"reportedType": [],
"runtimeStatus": null
},
{
"afterRecompute": {
"documentTouched": false,
"mustExecute": false,
"state": [
"Up-to-date"
]
},
"attr": 0,
"before": {
"documentTouched": false,
"mustExecute": false,
"state": [
"Up-to-date"
]
},
"changed": {
"documentTouched": false,
"mustExecute": false,
"state": [
"Up-to-date"
]
},
"id": "runtime-output",
"recomputeCount": 0,
"reportedStatus": [
"Output",
"21"
],
"reportedType": [],
"runtimeStatus": "Output"
},
{
"afterRecompute": {
"documentTouched": false,
"mustExecute": false,
"state": [
"Up-to-date"
]
},
"attr": 8,
"before": {
"documentTouched": false,
"mustExecute": false,
"state": [
"Up-to-date"
]
},
"changed": {
"documentTouched": false,
"mustExecute": false,
"state": [
"Up-to-date"
]
},
"id": "type-output",
"recomputeCount": 0,
"reportedStatus": [
"21",
"27"
],
"reportedType": [
"Output"
],
"runtimeStatus": null
},
{
"afterRecompute": {
"documentTouched": false,
"mustExecute": false,
"state": [
"Up-to-date"
]
},
"attr": 0,
"before": {
"documentTouched": false,
"mustExecute": false,
"state": [
"Up-to-date"
]
},
"changed": {
"documentTouched": true,
"mustExecute": false,
"state": [
"Touched"
]
},
"id": "runtime-no-recompute",
"recomputeCount": 1,
"reportedStatus": [
"NoRecompute",
"21"
],
"reportedType": [],
"runtimeStatus": "NoRecompute"
},
{
"afterRecompute": {
"documentTouched": false,
"mustExecute": false,
"state": [
"Up-to-date"
]
},
"attr": 16,
"before": {
"documentTouched": false,
"mustExecute": false,
"state": [
"Up-to-date"
]
},
"changed": {
"documentTouched": true,
"mustExecute": false,
"state": [
"Touched"
]
},
"id": "type-no-recompute",
"recomputeCount": 0,
"reportedStatus": [
"21",
"23"
],
"reportedType": [
"NoRecompute"
],
"runtimeStatus": null
}
],
"fcstd": {
"reopened": {
"properties": [
"Persisted",
"RuntimeTransient",
"TypeTransient"
],
"statuses": {
"Persisted": [
"Output",
"21"
],
"RuntimeTransient": [
"Transient",
"21"
],
"TypeTransient": [
"21",
"25"
]
},
"values": {
"Persisted": 11,
"RuntimeTransient": 0,
"TypeTransient": 0
}
},
"xml": {
"noPersistProperty": false,
"persistedProperty": true,
"runtimeTransientHasValue": false,
"runtimeTransientProperty": true,
"typeTransientHasValue": false,
"typeTransientProperty": true
}
},
"freecadVersion": "1.1.1",
"gitCommit": "0108fd4b4850cc46e625b60e53cea7a7bbe69f8d",
"lockDynamic": {
"failures": {
"remove": null,
"rename": {
"message": "Property LockedValue is locked",
"type": "RuntimeError"
}
},
"propertyStillPresent": true,
"renamedPropertyPresent": false,
"reportedStatus": [
"LockDynamic",
"21"
]
},
"schemaVersion": 1,
"status": "pass"
}

View File

@@ -41,7 +41,7 @@
"id": "EX03",
"title": "Application document, property and recompute semantics",
"tasks": [
{ "id": "EX-DOC-01", "title": "Implement every native property type, flag, editor and serialization rule", "priority": "P0", "status": "in_progress", "dependencies": ["EX-ORA-01"], "deliverables": ["Complete Property schema", "Status and editor metadata", "Binary and XML codecs"], "acceptance": ["Every runtime property fixture round-trips without type coercion or unknown loss"], "evidence": ["check:freecad-type-properties", "check:freecad-native-property-semantics", "check:freecad-fcstd-roundtrip"], "exactBlockedBy": ["Of 85 runtime property types and 5510 records, 62 types/692 records remain opaque-only and 2639 records use status semantics not represented natively by the Facade"] },
{ "id": "EX-DOC-01", "title": "Implement every native property type, flag, editor and serialization rule", "priority": "P0", "status": "in_progress", "dependencies": ["EX-ORA-01"], "deliverables": ["Complete Property schema", "Status and editor metadata", "Binary and XML codecs"], "acceptance": ["Every runtime property fixture round-trips without type coercion or unknown loss"], "evidence": ["check:freecad-type-properties", "check:freecad-native-property-semantics", "check:freecad-property-status", "check:freecad-fcstd-roundtrip"], "exactBlockedBy": ["Of 85 runtime property types and 5510 records, 62 types/692 records remain opaque-only; all 15 observed status classes are represented, 13 have native behavior evidence, and LockDynamic/PartialTrigger still lack dynamic mutation and partial-document observer implementation"] },
{ "id": "EX-DOC-02", "title": "Match transactions, DAG recompute, partial failure and document observers", "priority": "P0", "status": "in_progress", "dependencies": ["EX-DOC-01", "EX-TSN-04"], "deliverables": ["Transaction and observer event oracle", "Partial recompute scheduler", "Failure recovery contract"], "acceptance": ["Undo, redo, abort, stale and cyclic dependency behavior matches FreeCAD"], "evidence": ["check:document-closure", "test:facade"], "exactBlockedBy": ["Observer ordering and every partial-recompute branch are not yet oracle-backed"] },
{ "id": "EX-DOC-03", "title": "Complete expressions, links, extensions, groups and App object lifecycle", "priority": "P0", "status": "in_progress", "dependencies": ["EX-DOC-01"], "deliverables": ["Expression dependency grammar", "Link and extension lifecycle", "Group and clone semantics"], "acceptance": ["Copy, clone, delete, relink and expression edits survive native round-trip"], "evidence": ["check:fcstd-closure", "check:chrome-production-document"], "exactBlockedBy": ["FeaturePython-backed extensions remain non-executable"] },
{ "id": "EX-DOC-04", "title": "Complete multi-document, external link, merge and recovery workflows", "priority": "P1", "status": "pending", "dependencies": ["EX-DOC-02", "EX-DOC-03"], "deliverables": ["Cross-document Link corpus", "Merge and conflict semantics", "Crash and autosave recovery"], "acceptance": ["Open, close, relink, merge and recovery match the native document graph"], "evidence": ["check:chrome-persistence", "check:project-migration"], "exactBlockedBy": ["Current application is project-first and does not implement every desktop multi-document workflow"] },