Record 1.0.4 signed installation, automatic-follow verification and user test handoff
这个提交包含在:
1 父节点
e03e460a9b
当前提交
302dc20c0a
14 个文件已更改
+801
-10
没有与搜索条件相匹配的文件
+13
-3
@@ -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)。
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -0,0 +1 @@
|
||||
{"status":"Accepted","id":"8eb96294-5935-49ff-a487-3c4f60c27395","message":"Processing complete"}
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -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"
|
||||
}
|
||||
@@ -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。
|
||||
本次临时克隆已清理。
|
||||
@@ -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"
|
||||
}
|
||||
}
|
||||
}
|
||||
+12
-4
@@ -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)。最终文档标签另作独立克隆核验,源码构建依赖没有因文档更新改变。
|
||||
在新工单中引用
屏蔽一个用户