fix: guard dismissal honesty, one threshold source, EXIF proven (#39 r1)

r1-M1: dismissal (Escape/scrim/Cancel) while the reduce or keep-original
flow is executing no longer races the decision — hp-close is ignored while
busy, and every flow re-checks it still owns the guard before applying, so
a force-cleared dialog can never silently install its stale result. The
smoke now drives both: hp-close during a hanging decode leaves the busy
dialog up, and a force-cleared guard ends with clean staging, no toast, no
planFile. A new registry mutant removes the busy gate and is killed.

r1-M2: the hard-dialog text takes its limit from the imported
HARD_DIMENSION instead of a literal — recalibration stays a one-file
change, as the spec promises.

r1-M3: AC8 is now proven end to end, not plausible: the smoke splices a
real EXIF APP1 (orientation 6) into a canvas-encoded 8200×4100 JPEG,
asserts the header probe reads the unrotated SOF, that the decode call
carries imageOrientation:'from-image' (captured on the hook), and that the
reduced copy comes out portrait 2048×4096. TESTING.md names the scenario.

Issue: #39
User-Visible: no
This commit is contained in:
Codex
2026-08-29 10:13:09 +03:00
parent e84af749aa
commit 7c45372c32
22 changed files with 252 additions and 142 deletions
+12 -12
View File
@@ -3,7 +3,7 @@
"fixture": "synthetic-only",
"chromium": "151.0.7922.34",
"oxipng": null,
"sourceFingerprint": "d1601738e1c948689333e54d500881e860ba0f1dcaa1559aeacf5e1114d469f5",
"sourceFingerprint": "55e77e97e94985562de2bf89b0732cd429a7ab3c7a53ed62d7fa74bb80d3237e",
"captureScriptSha256": "fe76c8e2e27501e9a377d7aa15dd6cba6a018d55c07deb602dbee097f0a0a5ba",
"command": "npm run build && node demo/docs/capture.mjs",
"scenarios": {
@@ -15,8 +15,8 @@
},
"theme": "dark",
"language": "en",
"sourceSha256": "d1601738e1c948689333e54d500881e860ba0f1dcaa1559aeacf5e1114d469f5",
"imageSha256": "78d328498bd17a9ee1ec44b389d244b61fca9ac52c9aad6631aa85c53233fec0"
"sourceSha256": "55e77e97e94985562de2bf89b0732cd429a7ab3c7a53ed62d7fa74bb80d3237e",
"imageSha256": "0ca982495a7749907c48ebbddfd089c54385a4347f79f64e94af2c5a8d5c03eb"
},
"view-touch": {
"file": "02-view-touch.png",
@@ -26,7 +26,7 @@
},
"theme": "dark",
"language": "en",
"sourceSha256": "d1601738e1c948689333e54d500881e860ba0f1dcaa1559aeacf5e1114d469f5",
"sourceSha256": "55e77e97e94985562de2bf89b0732cd429a7ab3c7a53ed62d7fa74bb80d3237e",
"imageSha256": "3be239a5a494f6776540a9c0049694ee6f9d2ba927c8bcb4b26ee5a69a228a7d"
},
"space-create": {
@@ -37,7 +37,7 @@
},
"theme": "dark",
"language": "en",
"sourceSha256": "d1601738e1c948689333e54d500881e860ba0f1dcaa1559aeacf5e1114d469f5",
"sourceSha256": "55e77e97e94985562de2bf89b0732cd429a7ab3c7a53ed62d7fa74bb80d3237e",
"imageSha256": "a55b463055a565892ca139014e314a8f63fb5301c87fff2e48d7e69210fe9b6c"
},
"room-contour-close": {
@@ -48,7 +48,7 @@
},
"theme": "dark",
"language": "en",
"sourceSha256": "d1601738e1c948689333e54d500881e860ba0f1dcaa1559aeacf5e1114d469f5",
"sourceSha256": "55e77e97e94985562de2bf89b0732cd429a7ab3c7a53ed62d7fa74bb80d3237e",
"imageSha256": "dfad9a27371cfa397a3fd8dce7005f42d24649743f5322105ee894067d3a9f16"
},
"plan-context-tray": {
@@ -59,7 +59,7 @@
},
"theme": "dark",
"language": "en",
"sourceSha256": "d1601738e1c948689333e54d500881e860ba0f1dcaa1559aeacf5e1114d469f5",
"sourceSha256": "55e77e97e94985562de2bf89b0732cd429a7ab3c7a53ed62d7fa74bb80d3237e",
"imageSha256": "b75f348c632296da5c2fc142d53df613f757e1516acac315be50f5b4557729cc"
},
"device-editor": {
@@ -70,7 +70,7 @@
},
"theme": "dark",
"language": "en",
"sourceSha256": "d1601738e1c948689333e54d500881e860ba0f1dcaa1559aeacf5e1114d469f5",
"sourceSha256": "55e77e97e94985562de2bf89b0732cd429a7ab3c7a53ed62d7fa74bb80d3237e",
"imageSha256": "8affadfce926fe2f6cf344c33f611c44fcbc79c1969f69c3a6935ff2e99c36c3"
},
"device-display-preview": {
@@ -81,7 +81,7 @@
},
"theme": "dark",
"language": "en",
"sourceSha256": "d1601738e1c948689333e54d500881e860ba0f1dcaa1559aeacf5e1114d469f5",
"sourceSha256": "55e77e97e94985562de2bf89b0732cd429a7ab3c7a53ed62d7fa74bb80d3237e",
"imageSha256": "6f628abe6b89d7c4b352e6d73ac0b126526f6fdba5927bb774c5b884e484ca19"
},
"background-editor": {
@@ -92,7 +92,7 @@
},
"theme": "dark",
"language": "en",
"sourceSha256": "d1601738e1c948689333e54d500881e860ba0f1dcaa1559aeacf5e1114d469f5",
"sourceSha256": "55e77e97e94985562de2bf89b0732cd429a7ab3c7a53ed62d7fa74bb80d3237e",
"imageSha256": "a1d1a905f1410f73231d2ea5d1dfbd8ae79c2fe8b0a79cff87ebb977ac7a3103"
},
"room-card": {
@@ -103,7 +103,7 @@
},
"theme": "dark",
"language": "en",
"sourceSha256": "d1601738e1c948689333e54d500881e860ba0f1dcaa1559aeacf5e1114d469f5",
"sourceSha256": "55e77e97e94985562de2bf89b0732cd429a7ab3c7a53ed62d7fa74bb80d3237e",
"imageSha256": "48a5685039a5e0de2a28190d857b193c86e2e63606e3c7a8c40fc9d2b190da4e"
},
"device-info": {
@@ -114,7 +114,7 @@
},
"theme": "dark",
"language": "en",
"sourceSha256": "d1601738e1c948689333e54d500881e860ba0f1dcaa1559aeacf5e1114d469f5",
"sourceSha256": "55e77e97e94985562de2bf89b0732cd429a7ab3c7a53ed62d7fa74bb80d3237e",
"imageSha256": "29a342811aaedaebc54ba337792d60cb454a7cf4c3063b210f6c4bafe0a4d87b"
}
}