diff --git a/RECOVERY.md b/RECOVERY.md index 321cbca..84ff131 100644 --- a/RECOVERY.md +++ b/RECOVERY.md @@ -27,7 +27,7 @@ git switch --detach v1.0.4 ## 1.0.4 恢复入口 -最终交付标签为 `v1.0.4`,工作分支为 `main`;本次实际编译和独立恢复测试的代码节点为完整 SHA `22cd96a772f84895aacd5ccc1ef24e0711e933fa`。最终标签还包含验证文档。需要精确恢复已测试源码时可执行 `git switch --detach 22cd96a772f84895aacd5ccc1ef24e0711e933fa`。两者都保留初始模板及全部中间提交。 +最终交付标签为 `v1.0.4`,工作分支为 `main`;本次实际编译和独立恢复测试的代码节点为完整 SHA `e03e460a9b3e5ad489aad24095485ba10ceb987d`。最终标签还包含验证文档。需要精确恢复已测试源码时可执行 `git switch --detach e03e460a9b3e5ad489aad24095485ba10ceb987d`。两者都保留初始模板及全部中间提交。 依赖:Xcode27.1、FxPlug SDK4.3.4、PluginManager1.7.4,系统最低macOS13;Metal与Vision由系统提供。SDK头文件/链接存根安装到 `/Library/Developer/SDKs/FxPlug.sdk/Library/Frameworks`,可执行运行框架在 `/Library/Developer/Frameworks`;不要把SDK链接存根当运行框架嵌入APP。两者属于需重新安装的Apple外部依赖,仓库不保存证书/私钥或登录凭据。 diff --git a/Templates/大鱼人像美化/VALIDATION.json b/Templates/大鱼人像美化/VALIDATION.json index 725063e..df6e534 100644 --- a/Templates/大鱼人像美化/VALIDATION.json +++ b/Templates/大鱼人像美化/VALIDATION.json @@ -26,7 +26,7 @@ "hostValidation": { "date": "2026-10-21", "FCP": "Restored input-chain template shows supplied real video; effect parameters and forward analysis responded in independent QA project.", - "Motion": "Real-video ordinary project played with midtone=0.5 and brightness=0.75; face boxes followed changing positions.", - "scope": "1.0.3 render/brightness smoke passed; 1.0.4 automatic geometry alignment and canvas event native verification pending." + "Motion": "1.0.4 installed formal app loaded the real-video QA project and rendered brightness/geometry with a primary box at different playhead positions; offline tracking disabled.", + "scope": "Original input-chain/brightness native regression passed; 1.0.4 FCP automatic-follow and explicit OSC native click tests remain pending because user took over Motion/FCP self-testing. Offline 380 checks passed; no exhaustive occlusion/identity equivalence claim." } } diff --git a/docs/analysis/REA-分析与复刻说明.md b/docs/analysis/REA-分析与复刻说明.md index dd32569..a8d0791 100644 --- a/docs/analysis/REA-分析与复刻说明.md +++ b/docs/analysis/REA-分析与复刻说明.md @@ -22,7 +22,7 @@ REA 直接打开内嵌插件。原包为 arm64/x86_64 通用 Mach-O,Ghidra 无 ## 原版 FCP 模板的实际发布范围 -补充检查用户指定的 `~/Movies/Motion Templates.localized/Effects.localized/💙MS超级美颜/MS超级美颜V2/MS超级美颜V2.moef`:共15个发布入口,包括空名自定义面板入口、脸型、脸框预览、白牙、亮眼和混合,没有跟踪目标、跟踪开关或前向/后向分析按钮。清单和模板摘要见 [发布参数记录](reference-template-parameters.json)。二进制内部的分析/跟踪代码不能据此解释成当前FCP模板已开放的功能;本项目的三目标离线分析是独立扩展;原版无需离线分析就会自动跟随,不能从没有发布按钮推断没有自动跟随。 +补充检查用户指定的 `~/Movies/Motion Templates.localized/Effects.localized/💙MS超级美颜/MS超级美颜V2/MS超级美颜V2.moef`:共15个发布入口,包括空名自定义面板入口、脸型、脸框预览、白牙、亮眼和混合,没有跟踪目标、跟踪开关或前向/后向分析按钮。清单和模板摘要见 [发布参数记录](reference-template-parameters.json)。二进制内部的离线分析工具不应据此解释成模板公开控件;本项目的三目标离线分析是独立扩展;原版无需离线分析就会自动跟随,不能从没有发布按钮推断没有自动跟随。 ## 已实现的功能 @@ -30,7 +30,7 @@ REA 直接打开内嵌插件。原包为 arm64/x86_64 通用 Mach-O,Ghidra 无 - 肤色提亮、色相、饱和度、均匀肤色;原色及自然白、冷白、暖白、红润白、小麦、古铜六个程序化风格。 - 牙齿美白和眼睛提亮,基于 Vision 面部区域构建软蒙版。 - 瘦脸、大眼、短脸、窄脸、下巴、V 脸、下颌、颧骨、小头和小头范围。 -- 全脸/选中脸、画面点击选脸、多人高速检测、防跳脸范围、脸框和跟踪框。 +- 默认自动主要人脸几何跟随、矩形防跳、关键点稳定、失检保持和时间快照;默认外观蒙版保留整组检测范围,显式选脸与快速多人分别控制。 - 作为扩展提供三个独立跟踪目标,向前/向后分析,清除当前目标;精确 CMTime 数据持久化到宿主工程,可逆序和任意顺序读取。 - 蒙版阈值/柔度/边缘保护、皮肤/牙齿/眼睛通道预览与反转、包含几何变形的整体混合。 - 保留透明度、完整输入范围、非零图像原点与宿主上下原点;原生 FxPlug 参数可由宿主保存和制作关键帧。 @@ -43,11 +43,19 @@ REA 直接打开内嵌插件。原包为 arm64/x86_64 通用 Mach-O,Ghidra 无 2. 原版人脸网格/曲线位移采用本项目的平滑椭圆采样位移替代。各脸型权重和曲线、眼嘴软蒙版由本项目编写。 3. 皮肤支持区域使用 Vision 面部区域及独立的肤色/高通备用蒙版;原版完整皮肤分割、时间稳定和细部 mask 尚未等价恢复。 4. 本版最多保存三个独立目标、每次最多处理十六张脸。原版存在动态目标列表与旧版三目标字段,本次未完整恢复动态列表上限及全部分页操作。 -5. 离线分析记录与默认实时自动跟随须分开比较。原版实时几何链已证实由Vision重检测、temporal主体关联、防跳范围、关键点稳定/保持及回看历史组成;OpenCV动态库与VNTrackObject备用方法的存在不足以证明它们驱动当前render主链。复刻版实时流程正在按这些机制对齐,完整运动、多人交叉、遮挡与切镜仍需专项对照。 +5. 离线分析记录与默认实时自动跟随须分开比较。原版实时几何链已证实由Vision重检测、temporal主体关联、防跳范围、关键点稳定/保持及回看历史组成;OpenCV动态库与VNTrackObject备用方法的存在不足以证明它们驱动当前render主链。复刻版实时流程已按这些机制实现独立对齐,完整运动、多人交叉、遮挡与切镜仍需专项对照。 6. 界面使用宿主的分组滑块与开关;原版卡片面板的布局没有照搬。眼睛提亮在本版可用,所分析原版主链实际将该项输入设为零。 跟踪数据每目标保存上限为 64 MB;超过上限时保留此前已保存的数据并报告错误。长素材应分段分析。仅实际验证通过的内容计入完成;本说明中的未知项不因编译或离屏测试通过而自动消除。 +## 自动跟随实现范围 + +默认渲染已加入独立实时几何状态,完全不依赖三个离线目标或分析按钮。默认主要人脸按面积与居中评分、前框矩形防跳和最近中心关联;选点变化重新种子,快速多人采用多人变形。外观与变形几何分开,默认皮肤/牙齿/眼睛蒙版仍覆盖检测组,图像与蒙版再共享同一变形几何;显式“只处理选中人脸”保留本项目原有外观单脸语义,此显式范围未证明与原版完全等价。 + +自有稳定公式将旧关键点映射到当前框,再以0.9及时间因子混合,异常眼轴翻转时保持重映射点。最多1200条、序列化估算16MB的纯几何缓存不保存图像;仅使用不晚于请求且0.35秒内的参考,连续保持可推进输出时间。精确CMTime、原始几何与上下文一致的重复渲染直接复用,不反复平滑。原版还可取近未来历史,本版选择past-only,因此不是完全相同时间策略。 + +当前框仍以检测为准,稳定主要影响自有warp所使用的眼部点;没有恢复原版77点网格全部稳定公式。没有真正素材来源ID,同尺寸换源只能靠时间/原始几何变化隔离,不能保证识别任意换源。首次冷启动、热缓存与首次乱序可能存在差异;锁和缓存不等于全局顺序无关。 + ## 验证 `./scripts/test.sh` 运行实际 Metal/Core Image 像素测试及 Vision 人脸测试。测试素材是 scikit-image 发布的 NASA 公共领域人像,出处见 `tests/fixtures/ATTRIBUTION.txt`。测试包含实际人脸 landmarks、真实几何变化、五官蒙版、单次混合、透明度和跟踪存储恢复。 @@ -61,3 +69,5 @@ REA 直接打开内嵌插件。原包为 arm64/x86_64 通用 Mach-O,Ghidra 无 原版保存time/points/box历史,至多1200条并支持回看;平滑包含时间因子与约0.84–0.96的混合范围,完整组内公式及轴保护布尔组合未逐像素验证。原版存在近未来历史选择分支,所以不能宣称任意乱序严格确定。复刻将以独立公式实现机制,并限制读取当前时间之前的近时参考;该时间策略会比原版更保守,属于明确的实现差异。 本机原生观察:Motion中使用同一蓝发视频,原版UI默认多人关闭(单人)、防跳180%;启用检测框并调瘦脸/大眼后,播放时自动更新人脸框,没有先执行离线分析。此观察只覆盖该单人片段,不能替代多人遮挡与所有参数对照。 + +1.0.4已在Motion实际加载与不同播放头位置观察默认自动跟随输出;用户随后接管Motion/FCP自测,FCP该版自动跟随及显式OSC原生点击尚未完成自动验收。已完成范围与剩余验证见 [验证记录](../验证记录.md)。 diff --git a/docs/verification/installed-signature.txt b/docs/verification/installed-signature.txt new file mode 100644 index 0000000..78fc46f --- /dev/null +++ b/docs/verification/installed-signature.txt @@ -0,0 +1,24 @@ +Executable=/Library/Plug-Ins/FxPlug/beatygril.app/Contents/MacOS/beatygril +Identifier=com.dayu.beatygril +Format=app bundle with Mach-O universal (x86_64 arm64) +CodeDirectory v=20500 size=478 flags=0x10000(runtime) hashes=4+7 location=embedded +Hash type=sha256 size=32 +CandidateCDHash sha256=b77375a5d7c6d5d866ff21bfdc3ce85412dc1d0b +CandidateCDHashFull sha256=b77375a5d7c6d5d866ff21bfdc3ce85412dc1d0b463ff47fe896a52640762b4f +Hash choices=sha256 +CMSDigest=b77375a5d7c6d5d866ff21bfdc3ce85412dc1d0b463ff47fe896a52640762b4f +CMSDigestType=2 +CDHash=b77375a5d7c6d5d866ff21bfdc3ce85412dc1d0b +Signature size=8968 +Authority=Developer ID Application: zhong luo (B3W25FX5H5) +Authority=Developer ID Certification Authority +Authority=Apple Root CA +Timestamp=Oct 21, 2026 at 18:42:32 +Notarization Ticket=stapled +Info.plist entries=22 +TeamIdentifier=B3W25FX5H5 +Runtime Version=27.0.0 +Sealed Resources version=2 rules=13 files=4 +Internal requirements count=1 size=180 +Total signatures=1 +Chosen signature=1 diff --git a/docs/verification/live-face-asan.txt b/docs/verification/live-face-asan.txt new file mode 100644 index 0000000..b92d565 --- /dev/null +++ b/docs/verification/live-face-asan.txt @@ -0,0 +1,3 @@ +Face AddressSanitizer build and standalone run +Face processing: 116 checks passed +2026-10-21 18:40:05.422 face-tests[99927:5270835] FBBA: creating VNFaceBBoxAligner from VNFaceDetectorRevision2: VNFaceDetectorRevision2 diff --git a/docs/verification/notarization.json b/docs/verification/notarization.json new file mode 100644 index 0000000..86d17c6 --- /dev/null +++ b/docs/verification/notarization.json @@ -0,0 +1 @@ +{"status":"Accepted","id":"8eb96294-5935-49ff-a487-3c4f60c27395","message":"Processing complete"} diff --git a/docs/verification/recovery-e03e460-beauty-face.txt b/docs/verification/recovery-e03e460-beauty-face.txt new file mode 100644 index 0000000..2c6f0b5 --- /dev/null +++ b/docs/verification/recovery-e03e460-beauty-face.txt @@ -0,0 +1,8 @@ +Arguments: ["zsh", "scripts/test.sh"] +Environment additions: {} +Exit code: 0 + +Beauty renderer: 49 checks, 0 failures (Metal). +Face processing: 116 checks passed + +2026-10-21 18:42:58.952 face-tests[1253:5276682] FBBA: creating VNFaceBBoxAligner from VNFaceDetectorRevision2: VNFaceDetectorRevision2 diff --git a/docs/verification/recovery-e03e460-host-asan.txt b/docs/verification/recovery-e03e460-host-asan.txt new file mode 100644 index 0000000..7eeed08 --- /dev/null +++ b/docs/verification/recovery-e03e460-host-asan.txt @@ -0,0 +1,9 @@ +Arguments: ["zsh", "scripts/test-host.sh"] +Environment additions: {"PAINTFCP_HOST_ASAN": "1"} +Exit code: 0 + +Default IOSurface maximum byte difference: 0 +Alternate destination tag maximum byte difference: 0 +Host adapter: 117 checks, 0 failures + +2026-10-21 18:42:58.460 host-tests[1241:5276594] FBBA: creating VNFaceBBoxAligner from VNFaceDetectorRevision2: VNFaceDetectorRevision2 diff --git a/docs/verification/recovery-e03e460-osc-asan.txt b/docs/verification/recovery-e03e460-osc-asan.txt new file mode 100644 index 0000000..7abde29 --- /dev/null +++ b/docs/verification/recovery-e03e460-osc-asan.txt @@ -0,0 +1,26 @@ +Arguments: ["zsh", "scripts/test-osc.sh"] +Environment additions: {"PAINTFCP_OSC_ASAN": "1"} +Exit code: 0 + +OSC adapter: 98 checks, 0 failures + +2026-10-21 18:42:57.862 osc-tests[1236:5276552] PGFaceOSC point-write desired=(0.25,0.75) setter=(0.25,0.75) readback=(0.25,0.75) mode=normalized verified=1 +2026-10-21 18:42:57.887 osc-tests[1236:5276552] PGFaceOSC coordinates selection=(0.25,0.75) objectBounds=(-100,-50,200,100) canvas=(80,180) surface=320x240 origin=0 +2026-10-21 18:42:58.633 osc-tests[1236:5276552] PGFaceOSC point-write desired=(0.8,0.3) setter=(1152,-432) readback=(0.8,0.3) mode=centered-pixels verified=1 +2026-10-21 18:42:58.633 osc-tests[1236:5276552] PGFaceOSC coordinates selection=(0.7,0.4) objectBounds=(-1920,-1080,3840,2160) canvas=(152,78) surface=320x240 origin=0 +2026-10-21 18:42:58.734 osc-tests[1236:5276552] PGFaceOSC point-write desired=(0.8,0.3) setter=(0.8,0.3) readback=(0.12345,0.87654) mode=normalized verified=0 +2026-10-21 18:42:58.734 osc-tests[1236:5276552] PGFaceOSC point-write desired=(0.75,0.25) setter=(0.75,0.25) readback=(0.75,0.25) mode=normalized verified=1 +2026-10-21 18:42:58.734 osc-tests[1236:5276552] PGFaceOSC coordinates selection=(0.75,0.25) objectBounds=(-100,-50,200,100) canvas=(160,60) surface=320x240 origin=0 +2026-10-21 18:42:58.813 osc-tests[1236:5276552] PGFaceOSC point-write desired=(0.625,0.375) setter=(0.625,0.375) readback=(0.625,0.375) mode=normalized verified=1 +2026-10-21 18:42:58.813 osc-tests[1236:5276552] PGFaceOSC coordinates selection=(0.625,0.375) objectBounds=(-100,-50,200,100) canvas=(240,60) surface=320x240 origin=0 +2026-10-21 18:42:58.892 osc-tests[1236:5276552] PGFaceOSC point-write desired=(0.25,0.75) setter=(0.25,0.75) readback=(0.25,0.75) mode=normalized verified=1 +2026-10-21 18:42:58.892 osc-tests[1236:5276552] PGFaceOSC coordinates selection=(0.25,0.75) objectBounds=(-100,-50,200,100) canvas=(144,180) surface=320x240 origin=0 +2026-10-21 18:42:58.976 osc-tests[1236:5276552] PGFaceOSC point-write desired=(0.5,0.5) setter=(0.5,0.5) readback=(0.5,0.5) mode=normalized verified=1 +2026-10-21 18:42:58.977 osc-tests[1236:5276552] PGFaceOSC coordinates selection=(0,1) objectBounds=(-100,-50,200,100) canvas=(100,140) surface=320x240 origin=0 +2026-10-21 18:42:59.070 osc-tests[1236:5276552] PGFaceOSC coordinates selection=(0.25,0.75) objectBounds=(-100,-50,200,100) canvas=(nan,nan) surface=320x240 origin=0 +2026-10-21 18:42:59.137 osc-tests[1236:5276552] PGFaceOSC point-write desired=(0.5,0.5) setter=(0.5,0.5) readback=(0.5,0.5) mode=normalized verified=1 +2026-10-21 18:42:59.137 osc-tests[1236:5276552] PGFaceOSC coordinates selection=(0.25,0.75) objectBounds=(-100,-50,200,100) canvas=(inf,nan) surface=320x240 origin=0 +2026-10-21 18:42:59.206 osc-tests[1236:5276552] PGFaceOSC point-write desired=(0.5,0.5) setter=(0.5,0.5) readback=(0.5,0.5) mode=normalized verified=1 +2026-10-21 18:42:59.206 osc-tests[1236:5276552] PGFaceOSC coordinates selection=(0.25,0.75) objectBounds=(-100,-50,200,100) canvas=(80,nan) surface=320x240 origin=0 +2026-10-21 18:42:59.265 osc-tests[1236:5276552] PGFaceOSC point-write desired=(0.5,0.5) setter=(0.5,0.5) readback=(0.5,0.5) mode=normalized verified=1 +2026-10-21 18:42:59.265 osc-tests[1236:5276552] PGFaceOSC point-write desired=(0.5,0.5) setter=(0.5,0.5) readback=(0.5,0.5) mode=normalized verified=1 diff --git a/docs/verification/recovery-e03e460-xcode-list.txt b/docs/verification/recovery-e03e460-xcode-list.txt new file mode 100644 index 0000000..e90278e --- /dev/null +++ b/docs/verification/recovery-e03e460-xcode-list.txt @@ -0,0 +1,21 @@ +Arguments: ["xcodebuild", "-list", "-project", "beatygril/beatygril.xcodeproj"] +Environment additions: {} +Exit code: 0 + +Command line invocation: + /Applications/Xcode.app/Contents/Developer/usr/bin/xcodebuild -list -project beatygril/beatygril.xcodeproj + +Information about project "beatygril": + Targets: + Wrapper Application + XPC Service + + Build Configurations: + Debug + Release + + If no build configuration is specified and -scheme is not passed then "Release" is used. + + Schemes: + Wrapper Application + XPC Service diff --git a/docs/verification/recovery-e03e460.json b/docs/verification/recovery-e03e460.json new file mode 100644 index 0000000..ecd24b6 --- /dev/null +++ b/docs/verification/recovery-e03e460.json @@ -0,0 +1,609 @@ +{ + "target": "e03e460a9b3e5ad489aad24095485ba10ceb987d", + "remote": "https://dayu.media/git/dayu/paintfcp-fxplug.git", + "startedAt": "2026-10-21T10:42:53.349001+00:00", + "temporaryClone": "/var/folders/t4/kbc10sqs43b0rjf3nfh51nmw0000gn/T/paintfcp-final-recovery-e03e460-wsazshda/clone", + "scope": "Independent remote source recovery; no APP build, installation, execution, UI, source edits or commit.", + "cloneHead": "e03e460a9b3e5ad489aad24095485ba10ceb987d", + "files": { + "count": 51, + "allByteAndBlobAndModeEqual": true, + "entries": [ + { + "path": ".gitignore", + "bytes": 490, + "mode": "100644", + "gitBlob": "d2bca6e38076bb5f7574cc7781eadef27b41d9ff", + "sha256": "34e63260d343569ad4d5a1ffd6c15647da5a7da2b8940dc93f6d987c7fec474e", + "byteAndBlobAndModeEqual": true + }, + { + "path": "README.md", + "bytes": 2374, + "mode": "100644", + "gitBlob": "b23fa1dbe565ec9c076d5a070b9d3b15771d09eb", + "sha256": "b483ab1c164af35003277dcdeecf3e2d66c2c608461c2ea7ab17d7b2b87a781e", + "byteAndBlobAndModeEqual": true + }, + { + "path": "RECOVERY.md", + "bytes": 3722, + "mode": "100644", + "gitBlob": "321cbca369a7da1cb0da858381701d32d9145a6d", + "sha256": "5d1ba0793bb476ce10bfbe5a5b9195cb8be33d9987a1de29975de5ec92c25201", + "byteAndBlobAndModeEqual": true + }, + { + "path": "Templates/大鱼人像美化/Drop Zone.tiff", + "bytes": 420128, + "mode": "100644", + "gitBlob": "6d15c98bc221f999514f197ff67a7145836e6a38", + "sha256": "a7f8e3a2a431dbb3ce9e777040bb55e701cfe9ab9632e8cbb10359732bc8692e", + "byteAndBlobAndModeEqual": true + }, + { + "path": "Templates/大鱼人像美化/PARAMETERS.json", + "bytes": 9815, + "mode": "100644", + "gitBlob": "df2c01f370e6ee639d2950774fe8020742802c17", + "sha256": "bb561b0dfff90223f0925a60ec05b28518e22163a6bf7922c4efc6d155ddbabb", + "byteAndBlobAndModeEqual": true + }, + { + "path": "Templates/大鱼人像美化/README.md", + "bytes": 4180, + "mode": "100644", + "gitBlob": "e4317f896ea661029a9c3e6f38e1141692b20f92", + "sha256": "cab22a7d453a197f6fad5f38508e9bbfb1f55fb67d368b255dc8cc8b973f116c", + "byteAndBlobAndModeEqual": true + }, + { + "path": "Templates/大鱼人像美化/VALIDATION.json", + "bytes": 1749, + "mode": "100644", + "gitBlob": "725063ec5edc1d5fe39e9cf79a91f5e5da005853", + "sha256": "8aa839a756a23a64ab631ff558e16a5542f5311d5f9d0f6212a62150eb75ad1d", + "byteAndBlobAndModeEqual": true + }, + { + "path": "Templates/大鱼人像美化/大鱼人像美化.moef", + "bytes": 22996, + "mode": "100644", + "gitBlob": "98142a1ab47258a7fdd40c82ddc36ade6976fc04", + "sha256": "d234d504eba9e6d37b910b622a46c92458e658c5bbdad2caf5831c2a1463a3e2", + "byteAndBlobAndModeEqual": true + }, + { + "path": "beatygril/beatygril.xcodeproj/project.pbxproj", + "bytes": 22986, + "mode": "100644", + "gitBlob": "db5251bf3c337b865621e771a4b28690214f1c8e", + "sha256": "e9b9be100e53003f6bba96658d3a36078bb607236958e43aec6ed59f8c73ce32", + "byteAndBlobAndModeEqual": true + }, + { + "path": "beatygril/beatygril.xcodeproj/project.xcworkspace/contents.xcworkspacedata", + "bytes": 135, + "mode": "100644", + "gitBlob": "919434a6254f0e9651f402737811be6634a03e9c", + "sha256": "7f3b00b5c3fdb45242d7b87e1e5c4e25d1fa8129a16c94295ecc4e8ea2235c5f", + "byteAndBlobAndModeEqual": true + }, + { + "path": "beatygril/beatygril/Plugin/Info.plist", + "bytes": 3030, + "mode": "100644", + "gitBlob": "956728344f758fd35239c8f0cfe1a532c11f3f16", + "sha256": "b7285915328457ff63e146230a9db417c4a99a20b067930265dbc5b270988457", + "byteAndBlobAndModeEqual": true + }, + { + "path": "beatygril/beatygril/Plugin/PGBeautyRenderer.h", + "bytes": 1410, + "mode": "100644", + "gitBlob": "a0a6965c837072e6d837a98b701d59b1cc139655", + "sha256": "4e9b663c47261e4feceb7ab38c25171b65f36c14417d82a8b7c49ee3201492d3", + "byteAndBlobAndModeEqual": true + }, + { + "path": "beatygril/beatygril/Plugin/PGBeautyRenderer.m", + "bytes": 17132, + "mode": "100644", + "gitBlob": "4c9fc6fbb1dc1f2c4048a16435f554cae9f2ca74", + "sha256": "00b52b1f22c1e875f137ee4ea90f50d6caa38db277bebd0da538d0ba7e66072b", + "byteAndBlobAndModeEqual": true + }, + { + "path": "beatygril/beatygril/Plugin/PGBeautyTypes.h", + "bytes": 1149, + "mode": "100644", + "gitBlob": "e1cd3ef21f37b831cdaa7d9f52211cafaf243994", + "sha256": "6ea8005accc22f85fe8be1b73bf6e89a5b37ffd6e97460d4f6dd69d55eaf33cc", + "byteAndBlobAndModeEqual": true + }, + { + "path": "beatygril/beatygril/Plugin/PGFaceProcessor.h", + "bytes": 2178, + "mode": "100644", + "gitBlob": "0b861830a6e9652d81ccfe62f2ce758febee449f", + "sha256": "a3448bd75fd278c9702f079f55637ba2c26bc820bdbb81f49fb3a3d0e2a4aba5", + "byteAndBlobAndModeEqual": true + }, + { + "path": "beatygril/beatygril/Plugin/PGFaceProcessor.m", + "bytes": 36793, + "mode": "100644", + "gitBlob": "69359f52ef6473d034553d8cd9528881b4a0125f", + "sha256": "49ee6e5632d7ec043cbadef8596a153f1f6841eb4e658ea67b436f4aca9e60c4", + "byteAndBlobAndModeEqual": true + }, + { + "path": "beatygril/beatygril/Plugin/PGFaceSelectOSC.m", + "bytes": 11630, + "mode": "100644", + "gitBlob": "ae0aa7ce1c2de355b2c1cb890314a0de689df81a", + "sha256": "d5e1dd1db6825730803ddc3f21b588cd548cbbacc60760aa45ad9e2feedae307", + "byteAndBlobAndModeEqual": true + }, + { + "path": "beatygril/beatygril/Plugin/PGParameterIDs.h", + "bytes": 932, + "mode": "100644", + "gitBlob": "4cc0e20af1e659f1e8e666fabe01003c06cfd885", + "sha256": "8fdfa2021131317ce09532d27fd6f34fb0b505f7b17c561819336ad2a06c42cc", + "byteAndBlobAndModeEqual": true + }, + { + "path": "beatygril/beatygril/Plugin/beatygrilPlugIn.h", + "bytes": 347, + "mode": "100644", + "gitBlob": "12dca07a744c064d5d474e0294304ca29055a077", + "sha256": "4f00716328c9237b79cc58153ba47d8ac8ddc1786939cb206bd37b01e3b6397e", + "byteAndBlobAndModeEqual": true + }, + { + "path": "beatygril/beatygril/Plugin/beatygrilPlugIn.m", + "bytes": 24193, + "mode": "100644", + "gitBlob": "3f148956b32770c7db5b0df97700fd96f7e20025", + "sha256": "b8f4326ed3eb2de74770e4ea266d09ebe4aea70428a4511f0ec501a0cd89b247", + "byteAndBlobAndModeEqual": true + }, + { + "path": "beatygril/beatygril/Plugin/en.lproj/InfoPlist.strings", + "bytes": 85, + "mode": "100644", + "gitBlob": "9a5f27348a39c8e3ee50cffc2fb359c78a1319c8", + "sha256": "1b1cd5b74690bd5a74cf2b0a0c068bbc2c3462c5e9fe5ca3e61541bcbd451a7a", + "byteAndBlobAndModeEqual": true + }, + { + "path": "beatygril/beatygril/Plugin/en.lproj/Localizable.strings", + "bytes": 132, + "mode": "100644", + "gitBlob": "7f52f3dd719cb4f94e24867e36114cb061ef0b92", + "sha256": "b3036a2339b97ebf264516e1e534351d1ceb64f45942595508f4d67d07b07769", + "byteAndBlobAndModeEqual": true + }, + { + "path": "beatygril/beatygril/Plugin/main.m", + "bytes": 114, + "mode": "100644", + "gitBlob": "34d50d3f8cdf438d3508d0aa94e3f2d20e45f962", + "sha256": "5b812ddb1ef171fe075e4faf13d761935ca73ecbba1be0bd9d4802a64a7759cd", + "byteAndBlobAndModeEqual": true + }, + { + "path": "beatygril/beatygril/Wrapper Application/AppDelegate.h", + "bytes": 167, + "mode": "100644", + "gitBlob": "f3f8e19cfe057114c2289ff37c01c2e6e1aa7ed0", + "sha256": "3fc6516be93176f90c2deb17332c9cf98e670458a33fbad4fe7b8f367ec9494f", + "byteAndBlobAndModeEqual": true + }, + { + "path": "beatygril/beatygril/Wrapper Application/AppDelegate.m", + "bytes": 3003, + "mode": "100644", + "gitBlob": "1cb56f073356dd30add33415117bf4c24fdc4ef0", + "sha256": "acef6ade6591c039cd8b3e603f83d6d06f64da9709a0385b73c8588e824fe6de", + "byteAndBlobAndModeEqual": true + }, + { + "path": "beatygril/beatygril/Wrapper Application/Base.lproj/MainMenu.xib", + "bytes": 50614, + "mode": "100644", + "gitBlob": "57d03a50e249d189c5fa0a4602c5ec846f06612d", + "sha256": "7f0945bc5903a658550b712267870edecbdf1b73ac83c71f1358468f40c1ab1d", + "byteAndBlobAndModeEqual": true + }, + { + "path": "beatygril/beatygril/Wrapper Application/Info.plist", + "bytes": 1084, + "mode": "100644", + "gitBlob": "94b192675bf5651a7c66da35f04ff23e7b8f01c2", + "sha256": "b1e0922de60e32a703f62c34b508610d5a0329d70637911cfa4645c0fd19083d", + "byteAndBlobAndModeEqual": true + }, + { + "path": "beatygril/beatygril/Wrapper Application/SandboxEntitlements.entitlements", + "bytes": 240, + "mode": "100644", + "gitBlob": "852fa1a4728ae4789e3bca55dd07caef3b41f2a5", + "sha256": "b746c74b201e6af4e0864fbd1f4f629f96156a7ec4b7208bc995d0a5089bb592", + "byteAndBlobAndModeEqual": true + }, + { + "path": "beatygril/beatygril/Wrapper Application/en.lproj/Credits.rtf", + "bytes": 264, + "mode": "100644", + "gitBlob": "da779d0f6bec11568066e347a01ccef0308488b2", + "sha256": "ec846e198df85720e8443abb810334411b5690386f3062f90208c23b8575f28a", + "byteAndBlobAndModeEqual": true + }, + { + "path": "beatygril/beatygril/Wrapper Application/en.lproj/InfoPlist.strings", + "bytes": 0, + "mode": "100644", + "gitBlob": "e69de29bb2d1d6434b8b29ae775ad8c2e48c5391", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "byteAndBlobAndModeEqual": true + }, + { + "path": "beatygril/beatygril/Wrapper Application/main.m", + "bytes": 112, + "mode": "100644", + "gitBlob": "99ad4384792f9b2050e0755c07522c0dab9b4b86", + "sha256": "5c3dc97a53d0379af0e0ce75c5541f33c47f2da115d2d0018cfba003d185a63d", + "byteAndBlobAndModeEqual": true + }, + { + "path": "docs/analysis/REA-分析与复刻说明.md", + "bytes": 7652, + "mode": "100644", + "gitBlob": "dd32569f3d93f3533f257ed4d1ecd70a4eab271e", + "sha256": "6ca162a8eb43ef67b5bf55954d15c16aecefbfdfa5a1b687e7516cee4f141c9e", + "byteAndBlobAndModeEqual": true + }, + { + "path": "docs/analysis/auto-follow-report.json", + "bytes": 15665, + "mode": "100644", + "gitBlob": "e60d6d055a513ab8e9c21d2b39460c9d0698e1d3", + "sha256": "1a0c91efcaee058f331f6a7446bea8794af1dcf9120f5c2585f249b188d038e3", + "byteAndBlobAndModeEqual": true + }, + { + "path": "docs/analysis/beauty-preview.png", + "bytes": 617622, + "mode": "100644", + "gitBlob": "35ace472cb42629b01b3e05660cb7be8b9711fd7", + "sha256": "37aa97855915a49ff1f225a9e1fa9d8bcbed0be5f4109b6835ba4db17f9113f6", + "byteAndBlobAndModeEqual": true + }, + { + "path": "docs/analysis/face-preview.png", + "bytes": 713552, + "mode": "100644", + "gitBlob": "9a5bab3ad706b95ac32875352d16d6580dcd48ab", + "sha256": "6cc662cbb2b554a0dd8c926d94a0d819506ac76710d9c09c2d3d7f808fbf686b", + "byteAndBlobAndModeEqual": true + }, + { + "path": "docs/analysis/rea-auto-tracking.json", + "bytes": 2883488, + "mode": "100644", + "gitBlob": "2f5738f934f0ce89780cf4535c7257b54a397bef", + "sha256": "dc1007f3798fade5e454bb2ef0b58e4cfe2bb0256948c364070fd9af70a97377", + "byteAndBlobAndModeEqual": true + }, + { + "path": "docs/analysis/rea-host.json", + "bytes": 10111, + "mode": "100644", + "gitBlob": "9de443173a74668f0a2dced3426dae20549a16dd", + "sha256": "141866459948b19d5378de2f6534de333c795e317416f2ac6c9fdc86c94dd61a", + "byteAndBlobAndModeEqual": true + }, + { + "path": "docs/analysis/rea-plugin.json", + "bytes": 343165, + "mode": "100644", + "gitBlob": "79bcafbcfeda694ed466d95f81f30eb622a95a0b", + "sha256": "dda6e450915e1054653c28addfed5254c678dccf14ee66643d508e7087c1f0c1", + "byteAndBlobAndModeEqual": true + }, + { + "path": "docs/analysis/reference-template-parameters.json", + "bytes": 1608, + "mode": "100644", + "gitBlob": "9947e2ff182a146bc4c9120dfff7eacc8cca9c0c", + "sha256": "026e47e8ecbd9a967d8b8aabddac2a370479a43b9e1a7a7728b5b01a5002f006", + "byteAndBlobAndModeEqual": true + }, + { + "path": "docs/验证记录.md", + "bytes": 4783, + "mode": "100644", + "gitBlob": "22db834b9b61b5d1ede9fa4c16e0a8ffb2157821", + "sha256": "b030e25d23264e8bdfbf172a4b9f417bc30fdd35029a97b3579e3d5c5a0cc798", + "byteAndBlobAndModeEqual": true + }, + { + "path": "scripts/checkpoint.py", + "bytes": 2218, + "mode": "100644", + "gitBlob": "8248d1732aceed377d28cdae02873057f442474b", + "sha256": "3c27b0e603dd2d94512f611cec97bd9afe5809aea0f5a4bb213995d2e23366f8", + "byteAndBlobAndModeEqual": true + }, + { + "path": "scripts/deliver.py", + "bytes": 5858, + "mode": "100755", + "gitBlob": "1ab7b19e5e7f384e5491a93933b1cb5148a4fc1d", + "sha256": "1192f8458d8127677ae5353fd15ee8426d76871de60aac719e52da951e86cec0", + "byteAndBlobAndModeEqual": true + }, + { + "path": "scripts/test-host.sh", + "bytes": 1129, + "mode": "100755", + "gitBlob": "ef9c7f6436e3d1babbf272e9d329d65ec6c395cb", + "sha256": "7f55ed6de05e6cc59884fb7c96062676bd086f4ac745ae847511eacb12316467", + "byteAndBlobAndModeEqual": true + }, + { + "path": "scripts/test-osc.sh", + "bytes": 941, + "mode": "100755", + "gitBlob": "ffaed0b8d449eef6acf2fb352d9fea10fc1649fd", + "sha256": "ed405cd214ce252641074d0ef0a12c4cc0faf3e1869fe92716a98fff7f9ac517", + "byteAndBlobAndModeEqual": true + }, + { + "path": "scripts/test.sh", + "bytes": 765, + "mode": "100755", + "gitBlob": "2ec53312311eab71361399e2fb16a229042d4820", + "sha256": "b848347a4bcaa883300e75ac78682ac1f82ce07f2696e2457ee22226c06c7131", + "byteAndBlobAndModeEqual": true + }, + { + "path": "tests/beauty_render_tests.m", + "bytes": 16870, + "mode": "100644", + "gitBlob": "24050fb3a2630693253202ae1525c280f4f144eb", + "sha256": "b04eb2f0d78faec13bbdd2a3286cc74c46c2f536358c7c1c3d5d03c54daa868c", + "byteAndBlobAndModeEqual": true + }, + { + "path": "tests/face_tests.m", + "bytes": 33040, + "mode": "100644", + "gitBlob": "76a05235db8c7ab4c9b59ab6f184be2524443b6e", + "sha256": "288654ac41fcbec3db79605a2c215a1284c9b431fcbc0379974a8b6e546d6da4", + "byteAndBlobAndModeEqual": true + }, + { + "path": "tests/fixtures/ATTRIBUTION.txt", + "bytes": 498, + "mode": "100644", + "gitBlob": "6e439ab97256952b0acd1eef0e1c1b4ab3ea015c", + "sha256": "8823ad8aed1a5c1bdda93946e4b5ed24cd542e996a2b8087517cf62f7f4f2a84", + "byteAndBlobAndModeEqual": true + }, + { + "path": "tests/fixtures/astronaut.png", + "bytes": 791555, + "mode": "100644", + "gitBlob": "834cda0012478c5edc8d43bade96d315dedeaab4", + "sha256": "88431cd9653ccd539741b555fb0a46b61558b301d4110412b5bc28b5e3ea6cb5", + "byteAndBlobAndModeEqual": true + }, + { + "path": "tests/host_adapter_tests.m", + "bytes": 30363, + "mode": "100644", + "gitBlob": "8091c1523eb0b05295c391e20637c931d681e049", + "sha256": "77131c770222d3b404204fb04bf47cf943885eeff6acfc7498d59feb28eb1e73", + "byteAndBlobAndModeEqual": true + }, + { + "path": "tests/osc_tests.m", + "bytes": 22495, + "mode": "100644", + "gitBlob": "66fff5f78f8e0ba08026e53375b184a460a29162", + "sha256": "a3199147e32facd63373b53f77840408411b04436fb1dd42e2fb71023c8f2f8a", + "byteAndBlobAndModeEqual": true + } + ] + }, + "requiredResources": [ + { + "path": "Templates/大鱼人像美化/大鱼人像美化.moef", + "exists": true, + "bytes": 22996 + }, + { + "path": "Templates/大鱼人像美化/Drop Zone.tiff", + "exists": true, + "bytes": 420128 + }, + { + "path": "beatygril/beatygril/Wrapper Application/Base.lproj/MainMenu.xib", + "exists": true, + "bytes": 50614 + }, + { + "path": "beatygril/beatygril/Wrapper Application/en.lproj/Credits.rtf", + "exists": true, + "bytes": 264 + }, + { + "path": "beatygril/beatygril/Wrapper Application/en.lproj/InfoPlist.strings", + "exists": true, + "bytes": 0 + }, + { + "path": "beatygril/beatygril/Plugin/en.lproj/InfoPlist.strings", + "exists": true, + "bytes": 85 + }, + { + "path": "beatygril/beatygril/Plugin/en.lproj/Localizable.strings", + "exists": true, + "bytes": 132 + }, + { + "path": "tests/fixtures/astronaut.png", + "exists": true, + "bytes": 791555 + }, + { + "path": "tests/fixtures/ATTRIBUTION.txt", + "exists": true, + "bytes": 498 + } + ], + "gitFsck": { + "args": [ + "git", + "fsck", + "--full", + "--strict" + ], + "returncode": 0, + "stdout": "", + "stderr": "" + }, + "submodules": { + "args": [ + "git", + "submodule", + "status", + "--recursive" + ], + "returncode": 0, + "stdout": "", + "stderr": "" + }, + "lfsPointerFiles": [], + "lfsAttributesPresent": false, + "remoteRefs": { + "args": [ + "git", + "ls-remote", + "origin", + "refs/heads/main" + ], + "returncode": 0, + "stdout": "e03e460a9b3e5ad489aad24095485ba10ceb987d\trefs/heads/main\n", + "stderr": "" + }, + "checkpointInvocation": { + "mode": "100644", + "correctInvocation": "python3 scripts/checkpoint.py ...", + "helpCheck": { + "args": [ + "python3", + "scripts/checkpoint.py", + "--help" + ], + "returncode": 0, + "stdout": "usage: checkpoint.py [-h] [--tag TAG] message files [files ...]\n\npositional arguments:\n message\n files\n\noptions:\n -h, --help show this help message and exit\n --tag TAG\n", + "stderr": "" + } + }, + "checks": { + "beauty-face": { + "args": [ + "zsh", + "scripts/test.sh" + ], + "returncode": 0, + "stdout": "Beauty renderer: 49 checks, 0 failures (Metal).\nFace processing: 116 checks passed\n", + "stderr": "2026-10-21 18:42:58.952 face-tests[1253:5276682] FBBA: creating VNFaceBBoxAligner from VNFaceDetectorRevision2: VNFaceDetectorRevision2\n", + "elapsedSeconds": 2.662, + "environment": {}, + "transcript": "/Users/dayu/Documents/PaintFCP/build/delivery/recovery-e03e460-beauty-face.txt" + }, + "host-asan": { + "args": [ + "zsh", + "scripts/test-host.sh" + ], + "returncode": 0, + "stdout": "Default IOSurface maximum byte difference: 0\nAlternate destination tag maximum byte difference: 0\nHost adapter: 117 checks, 0 failures\n", + "stderr": "2026-10-21 18:42:58.460 host-tests[1241:5276594] FBBA: creating VNFaceBBoxAligner from VNFaceDetectorRevision2: VNFaceDetectorRevision2\n", + "elapsedSeconds": 2.32, + "environment": { + "PAINTFCP_HOST_ASAN": "1" + }, + "transcript": "/Users/dayu/Documents/PaintFCP/build/delivery/recovery-e03e460-host-asan.txt" + }, + "osc-asan": { + "args": [ + "zsh", + "scripts/test-osc.sh" + ], + "returncode": 0, + "stdout": "OSC adapter: 98 checks, 0 failures\n", + "stderr": "2026-10-21 18:42:57.862 osc-tests[1236:5276552] PGFaceOSC point-write desired=(0.25,0.75) setter=(0.25,0.75) readback=(0.25,0.75) mode=normalized verified=1\n2026-10-21 18:42:57.887 osc-tests[1236:5276552] PGFaceOSC coordinates selection=(0.25,0.75) objectBounds=(-100,-50,200,100) canvas=(80,180) surface=320x240 origin=0\n2026-10-21 18:42:58.633 osc-tests[1236:5276552] PGFaceOSC point-write desired=(0.8,0.3) setter=(1152,-432) readback=(0.8,0.3) mode=centered-pixels verified=1\n2026-10-21 18:42:58.633 osc-tests[1236:5276552] PGFaceOSC coordinates selection=(0.7,0.4) objectBounds=(-1920,-1080,3840,2160) canvas=(152,78) surface=320x240 origin=0\n2026-10-21 18:42:58.734 osc-tests[1236:5276552] PGFaceOSC point-write desired=(0.8,0.3) setter=(0.8,0.3) readback=(0.12345,0.87654) mode=normalized verified=0\n2026-10-21 18:42:58.734 osc-tests[1236:5276552] PGFaceOSC point-write desired=(0.75,0.25) setter=(0.75,0.25) readback=(0.75,0.25) mode=normalized verified=1\n2026-10-21 18:42:58.734 osc-tests[1236:5276552] PGFaceOSC coordinates selection=(0.75,0.25) objectBounds=(-100,-50,200,100) canvas=(160,60) surface=320x240 origin=0\n2026-10-21 18:42:58.813 osc-tests[1236:5276552] PGFaceOSC point-write desired=(0.625,0.375) setter=(0.625,0.375) readback=(0.625,0.375) mode=normalized verified=1\n2026-10-21 18:42:58.813 osc-tests[1236:5276552] PGFaceOSC coordinates selection=(0.625,0.375) objectBounds=(-100,-50,200,100) canvas=(240,60) surface=320x240 origin=0\n2026-10-21 18:42:58.892 osc-tests[1236:5276552] PGFaceOSC point-write desired=(0.25,0.75) setter=(0.25,0.75) readback=(0.25,0.75) mode=normalized verified=1\n2026-10-21 18:42:58.892 osc-tests[1236:5276552] PGFaceOSC coordinates selection=(0.25,0.75) objectBounds=(-100,-50,200,100) canvas=(144,180) surface=320x240 origin=0\n2026-10-21 18:42:58.976 osc-tests[1236:5276552] PGFaceOSC point-write desired=(0.5,0.5) setter=(0.5,0.5) readback=(0.5,0.5) mode=normalized verified=1\n2026-10-21 18:42:58.977 osc-tests[1236:5276552] PGFaceOSC coordinates selection=(0,1) objectBounds=(-100,-50,200,100) canvas=(100,140) surface=320x240 origin=0\n2026-10-21 18:42:59.070 osc-tests[1236:5276552] PGFaceOSC coordinates selection=(0.25,0.75) objectBounds=(-100,-50,200,100) canvas=(nan,nan) surface=320x240 origin=0\n2026-10-21 18:42:59.137 osc-tests[1236:5276552] PGFaceOSC point-write desired=(0.5,0.5) setter=(0.5,0.5) readback=(0.5,0.5) mode=normalized verified=1\n2026-10-21 18:42:59.137 osc-tests[1236:5276552] PGFaceOSC coordinates selection=(0.25,0.75) objectBounds=(-100,-50,200,100) canvas=(inf,nan) surface=320x240 origin=0\n2026-10-21 18:42:59.206 osc-tests[1236:5276552] PGFaceOSC point-write desired=(0.5,0.5) setter=(0.5,0.5) readback=(0.5,0.5) mode=normalized verified=1\n2026-10-21 18:42:59.206 osc-tests[1236:5276552] PGFaceOSC coordinates selection=(0.25,0.75) objectBounds=(-100,-50,200,100) canvas=(80,nan) surface=320x240 origin=0\n2026-10-21 18:42:59.265 osc-tests[1236:5276552] PGFaceOSC point-write desired=(0.5,0.5) setter=(0.5,0.5) readback=(0.5,0.5) mode=normalized verified=1\n2026-10-21 18:42:59.265 osc-tests[1236:5276552] PGFaceOSC point-write desired=(0.5,0.5) setter=(0.5,0.5) readback=(0.5,0.5) mode=normalized verified=1\n", + "elapsedSeconds": 2.201, + "environment": { + "PAINTFCP_OSC_ASAN": "1" + }, + "transcript": "/Users/dayu/Documents/PaintFCP/build/delivery/recovery-e03e460-osc-asan.txt" + }, + "xcode-list": { + "args": [ + "xcodebuild", + "-list", + "-project", + "beatygril/beatygril.xcodeproj" + ], + "returncode": 0, + "stdout": "Command line invocation:\n /Applications/Xcode.app/Contents/Developer/usr/bin/xcodebuild -list -project beatygril/beatygril.xcodeproj\n\nInformation about project \"beatygril\":\n Targets:\n Wrapper Application\n XPC Service\n\n Build Configurations:\n Debug\n Release\n\n If no build configuration is specified and -scheme is not passed then \"Release\" is used.\n\n Schemes:\n Wrapper Application\n XPC Service\n\n", + "stderr": "", + "elapsedSeconds": 1.096, + "environment": {}, + "transcript": "/Users/dayu/Documents/PaintFCP/build/delivery/recovery-e03e460-xcode-list.txt" + } + }, + "testSummary": { + "checks": { + "beauty": 49, + "face": 116, + "host": 117, + "osc": 98 + }, + "total": 380, + "failures": 0, + "asan": [ + "host", + "osc" + ] + }, + "workspaceDifferencesFromTarget": [], + "workspaceExpectedDocumentationDifferencesOnly": true, + "clonePostCheckTrackedDiff": { + "args": [ + "git", + "status", + "--porcelain", + "--untracked-files=no" + ], + "returncode": 0, + "stdout": "", + "stderr": "" + }, + "passed": true, + "notes": [ + "Expected RECOVERY.md/docs/验证记录.md edits after source freeze do not invalidate byte recovery of this commit.", + "scripts/checkpoint.py mode 100644 is usable through explicit python3 invocation; --help passed.", + "Only standalone CLI test programs and Xcode project listing were executed. No APP build or host/UI execution." + ], + "temporaryCloneRemoved": true, + "completedAt": "2026-10-21T10:42:59.816535+00:00" +} diff --git a/docs/verification/recovery-e03e460.txt b/docs/verification/recovery-e03e460.txt new file mode 100644 index 0000000..ed81f4a --- /dev/null +++ b/docs/verification/recovery-e03e460.txt @@ -0,0 +1,18 @@ +独立远端恢复验收:通过 +源码节点:e03e460a9b3e5ad489aad24095485ba10ceb987d +远程:https://dayu.media/git/dayu/paintfcp-fxplug.git +远程 main 与节点精确一致。 + +新临时克隆 detached 检出:51 个跟踪文件逐 byte/blob/模式一致。 +必要 9 项资源完整(包含标准 Drop Zone.tiff、NASA astronaut fixture 与授权说明)。 +git fsck --full --strict 通过;无 LFS 指针、无子模块。 + +完整离屏检查 380:Beauty49 + Face116 + Host117 + OSC98,零失败。 +Host、OSC 均使用 AddressSanitizer,通过。 +xcodebuild -list 通过;未构建 APP。 + +工作区相对源码节点的预期文档差异: +- 无 +checkpoint.py 模式 100644;python3 scripts/checkpoint.py --help 已通过。 +未修改源码、提交、安装、启动 APP 或操作宿主 UI。 +本次临时克隆已清理。 diff --git a/docs/verification/release-receipt.json b/docs/verification/release-receipt.json new file mode 100644 index 0000000..e53f21d --- /dev/null +++ b/docs/verification/release-receipt.json @@ -0,0 +1,54 @@ +{ + "version": "1.0.4", + "build": "6", + "mainBundleID": "com.dayu.beatygril", + "pluginBundleID": "com.dayu.beatygril.fxplug", + "sourceCommit": "e03e460a9b3e5ad489aad24095485ba10ceb987d", + "notarization": { + "status": "Accepted", + "id": "8eb96294-5935-49ff-a487-3c4f60c27395", + "message": "Processing complete" + }, + "architectures": "x86_64 arm64", + "inventoryRoots": [ + "/Users/dayu/Documents/PaintFCP", + "/Users/dayu/Library/Developer/Xcode/DerivedData", + "/Users/dayu/Downloads", + "/Users/dayu/Desktop", + "/Applications", + "/Library/Plug-Ins/FxPlug", + "/tmp/paintfcp-build-20261021" + ], + "appCopiesBeforeCleanup": [ + "/Users/dayu/Documents/PaintFCP/build/delivery/previous-beatygril.app", + "/Library/Plug-Ins/FxPlug/beatygril.app", + "/tmp/paintfcp-build-20261021/Build/Products/Release/beatygril.app" + ], + "inventoryErrors": [], + "appCopiesAfterCleanup": [ + "/Library/Plug-Ins/FxPlug/beatygril.app" + ], + "temporaryBuildRemoved": true, + "previousBackupRemoved": true, + "notarizationZipRemoved": true, + "registry": "com.dayu.beatygril.fxplug(1.1)\n\t Path = /Library/Plug-Ins/FxPlug/beatygril.app/Contents/PlugIns/beatygril XPC Service.pluginkit\n\t UUID = 6E26839B-7A7D-4BF9-B3EA-EA0F0F35F54D\n\t Timestamp = 2026-10-21 10:43:01 +0000\n\t Parent Bundle = /Library/Plug-Ins/FxPlug/beatygril.app\n\t Display Name = 大鱼人像美化\n\t Short Name = beatygril XPC Service\n\t Parent Name = beatygril\n\t Platform = macOS\n\n (1 plug-in)", + "hostValidation": { + "Motion": "1.0.4 formal plugin loaded real-video project and produced beauty + primary tracking box; playhead changed across source positions; no offline analysis enabled in project. Native explicit OSC click test incomplete due user interaction.", + "FCP": "Template input/brightness passed native tests before realtime alignment; 1.0.4 automatic-follow native FCP test not yet performed.", + "handoff": "User explicitly requested to operate Motion/FCP for self-testing; automation ceased." + }, + "installedFinalChecks": { + "signature": { + "exit": 0, + "output": "" + }, + "ticket": { + "exit": 0, + "output": "Processing: /Library/Plug-Ins/FxPlug/beatygril.app\nThe validate action worked!\n" + }, + "gatekeeper": { + "exit": 0, + "output": "/Library/Plug-Ins/FxPlug/beatygril.app: accepted\nsource=Notarized Developer ID\n" + } + } +} diff --git a/docs/验证记录.md b/docs/验证记录.md index 22db834..4cfdf58 100644 --- a/docs/验证记录.md +++ b/docs/验证记录.md @@ -14,22 +14,30 @@ FCP:使用用户给定的3840×2160、25fps蓝发人像视频。新建独立 Motion:独立普通视频项目,源PTS0、1920×1080/25fps/10秒,媒体通过本机链接引用给定视频;开启50%中频、75%提亮与人脸框。切换滤镜启用、从第1帧播放到第179帧均正常出图,人脸框随画面位置更新;选中滤镜可正常建立OSC连接。此QA工程依赖外置卷原视频,不作为可移植产品资源交付。 -选脸控件:原生验收额外发现OBJECT坐标被二次归一化,十字落在画面角落;现直接使用归一化OBJECT坐标转换至CANVAS像素。Motion点参数桥接会归一化读取,却按中心像素写入,新增事件内读回检测及兼容转换,并校验最终位置;不依赖宿主版本号猜测。50项OSC测试同时覆盖文档约定与Motion像素桥接。原生回写结果待最终安装后补齐。公开坐标依据:[Apple Creating Onscreen Controls](https://developer.apple.com/library/archive/documentation/AppleApplications/Conceptual/FXPlug_overview/OnScreenControls/OnScreenControls.html)。 +选脸控件:原生验收额外发现OBJECT坐标被二次归一化,十字落在画面角落;现直接使用归一化OBJECT坐标转换至CANVAS像素。Motion点参数桥接会归一化读取,却按中心像素写入,新增事件内读回检测及兼容转换,并校验最终位置;不依赖宿主版本号猜测。98项OSC测试同时覆盖文档约定与Motion像素桥接。事件现显式使用CANVAS坐标并由宿主转换回OBJECT,避免OBJECT鼠标事件的单位歧义。1.0.4的显式选脸点击回写尚未完成原生复测;界面被用户接管自测,已按要求停止自动化操作。98项离屏OSC/ASan检查不能替代这项原生验收。公开坐标依据:[Apple Creating Onscreen Controls](https://developer.apple.com/library/archive/documentation/AppleApplications/Conceptual/FXPlug_overview/OnScreenControls/OnScreenControls.html)。 宿主在更新前退出,新正式版安装后重新打开。曾在旧XPC连接未释放、临时构建插件仍被注册的热替换环境出现宿主关闭挂起/OSC连接崩溃;交付流程已增加宿主关闭检查,并在原生验收前注销构建目录的插件。没有把该崩溃直接归因为某条提亮公式。 ## 功能边界与原版跟踪选项 -用户给出的MS超级美颜V2.moef共发布15个入口,没有跟踪、前向或后向分析控件。二进制内部类/方法名称不能证明FCP模板对用户开放了跟踪。复刻版的三目标分析、选脸与持久化属于独立扩展。 +用户给出的MS超级美颜V2.moef共发布15个入口,没有跟踪、前向或后向分析控件。没有额外分析按钮不影响原版默认自动跟随;活跃render路径与Motion运行均已确认这一点。复刻版的三目标离线分析与持久化属于独立扩展,应与默认实时跟随分开理解。 六种肤色风格采用自写调色变换,脸型使用基于Vision关键点的近似局部反向采样;未复制原版私有LUT或算法资源。没有完成原版逐像素对齐、全部脸型强度主观比对、多人交叉遮挡、所有宿主版本及Intel硬件验收。源码层保存/恢复测试不代替两宿主所有工程关闭重开场景。 ## 自动化与恢复 -渲染/人脸/宿主适配器/OSC测试使用公共NASA人像与合成数据,覆盖默认直通、像素格式与画面原点、极值、连续调色蒙版、蓝发抑制、选脸/分析状态和错误处理。最终代码节点为22cd96a772f84895aacd5ccc1ef24e0711e933fa,281项检查通过:渲染49、人脸65、宿主适配117、OSC50,零失败。宿主适配器和OSC测试启用AddressSanitizer。 +渲染/人脸/宿主适配器/OSC测试使用公共NASA人像与合成数据,覆盖默认直通、像素格式与画面原点、极值、连续调色蒙版、蓝发抑制、选脸/分析状态和错误处理。最终代码节点为e03e460a9b3e5ad489aad24095485ba10ceb987d,380项检查通过:渲染49、人脸116、宿主适配117、OSC98,零失败。宿主适配器和OSC测试启用AddressSanitizer。 远端独立克隆核验检查受跟踪文件字节、工程资源、Git对象完整性和可执行脚本模式,无LFS与子模块。scripts/checkpoint.py以100644保存,按文档使用python3调用;它不是可直接执行的入口,恢复测试报告中该权限提示不表示源码丢失。 ## 正式交付 -最终Release签名、公证Accepted回执、票据验证、安装路径与副本清理结果将在原生验收结束后记录。唯一正式APP路径固定为 /Library/Plug-Ins/FxPlug/beatygril.app;FCP效果模板在用户Movies/Motion Templates.localized/Effects.localized/大鱼/大鱼人像美化内,必须同时有.moef与Drop Zone.tiff。 +1.0.4 build6为通用Release,已按由内到外正式签名,codesign严格验证、Apple公证Accepted(8eb96294-5935-49ff-a487-3c4f60c27395)、票据粘附/验证、Gatekeeper及安装身份验证通过。临时构建APP、旧版备份APP及公证ZIP已清理,检查的项目、DerivedData、桌面、下载、Applications、正式FxPlug目录与本次临时构建路径只剩正式APP,该产品插件注册为1个正式路径;详细扫描范围见verification/release-receipt.json。唯一正式APP路径固定为 /Library/Plug-Ins/FxPlug/beatygril.app;FCP效果模板在用户Movies/Motion Templates.localized/Effects.localized/大鱼/大鱼人像美化内,必须同时有.moef与Drop Zone.tiff。 + +## 1.0.4 自动跟随专项 + +已按原版活跃路径加入自动主体关联、矩形防跳、关键点稳定、失检保持与独立时间缓存;默认不要求分析。新增51项人脸回归,覆盖移动、多脸作用范围、重选、重复帧、失检、矩形边界、轴向保护、历史缓存、并发及不改离线存档;独立审查曾发现A→B→A重选后的回看范围混淆,修复后独立复现保持同一输出。Face116另有ASan通过。 + +原版完整数学系数未恢复,本版使用自有平滑公式与past-only时间策略;当前检测框未做原版77点网格级稳定,没有真正sourceID,不能声称任意同尺寸换源或首次乱序完全一致。原生1.0.4:Motion成功加载正式路径插件,实际视频在不同播放头位置正常显示提亮、脸型和黄色主要人脸框;项目未执行离线分析,“使用跟踪数据”读取为0。用户随后明确接管Motion/FCP进行自测,自动化已停止,因此尚未完成1.0.4的FCP自动跟随、显式OSC点击回写及两宿主复杂场景验收。FCP黑屏输入链与提亮此前已原生复测,不能把它们混称为1.0.4所有自动跟随场景通过。详见分析说明的具体边界。 + +代码节点已从远端独立克隆恢复,51项受跟踪文件与9项必要资源逐字节/对象/文件模式一致;380项检查、严格fsck与Xcode工程读取全部通过,无LFS或子模块。验收报告见 [独立恢复摘要](verification/recovery-e03e460.txt) 与 [完整记录](verification/recovery-e03e460.json)。最终文档标签另作独立克隆核验,源码构建依赖没有因文档更新改变。