Release notarized 1.3.1 installer with installed Motion effect resources

这个提交包含在:
dayu 于 2026-10-22 16:57:42 +08:00 提交
1 父节点 83ed140c2e
当前提交 b35b4a5d1c
17 个文件已更改
+594 -16

没有与搜索条件相匹配的文件

+2
查看文件
@@ -40,3 +40,5 @@ reference-binaries/
# Reviewed signed release installer (intentional distribution artifact)
!releases/1.2.0/*.pkg
!releases/1.3.1/*.pkg
+2 -2
查看文件
@@ -10,9 +10,9 @@
正式安装路径为 `/Library/Plug-Ins/FxPlug/beatygril.app`。Motion 滤镜分类为「大鱼」,滤镜名「大鱼人像美化」。Final Cut Pro 在「效果 → 大鱼磨皮瘦脸 → 大鱼人像美化」中使用配套 Motion 效果,模板目录必须同时保留 `.moef` 与 `Drop Zone.tiff`。美化会随当前帧的人脸自动更新,不需要点击分析。界面以磨皮、美白、瘦脸三张卡片呈现,默认跟随主要人脸;多人模式对多脸变形。单项眼睛可暂时停用并保留数值,右侧箭头恢复默认;磨皮半径、饱和度、锐化和整体混合等收在「更多设置」。旧手动分析与调试参数仅保留隐藏兼容,实际输出统一使用实时自动跟随。
1.3.0 的磨皮卡片依次提供「磨皮程度、微细锐化、五官保护、非肤色区保护」。两种保护默认 100%;降低五官保护让五官区域参与更多磨皮,降低非肤色区保护则扩大磨皮范围,均不扩大肤色提亮范围。微细锐化在局部支持区域恢复纹理;旧全局磨皮和全局锐化仍保留在更多设置,旧工程的参数与归档继续兼容。迁移证据、实现边界与验证见[新版磨皮参数迁移](docs/analysis/新版磨皮参数迁移.md)。1.3.0(15)APP 已完成签名、公证及正式安装,1636 项自动检查通过;原生宿主效果由用户实测。1.2.0 下载链接仍对应原发行包,本次未更新文章或安装包。
1.3.0 的磨皮卡片依次提供「磨皮程度、微细锐化、五官保护、非肤色区保护」。两种保护默认 100%;降低五官保护让五官区域参与更多磨皮,降低非肤色区保护则扩大磨皮范围,均不扩大肤色提亮范围。微细锐化在局部支持区域恢复纹理;旧全局磨皮和全局锐化仍保留在更多设置,旧工程的参数与归档继续兼容。迁移证据、实现边界与验证见[新版磨皮参数迁移](docs/analysis/新版磨皮参数迁移.md)。1.3.0 的新增参数已随 1.3.1 一并提供。
1.3.1(16)修复 V 脸影响眼区的问题,改为四组下颌轮廓到外唇的局部采样,并对齐新目标的 0.065 强度映射。1901 项自动检查通过;正式交付状态见验证记录。原理与边界见 [V 脸下颌区域修复](docs/analysis/V脸下颌区域修复.md)。
1.3.1(16)修复 V 脸影响眼区的问题,改为四组下颌轮廓到外唇的局部采样,并对齐新目标的 0.065 强度映射。1901 项自动检查通过,APP 与本机 PKG 工坊制作的安装包均已签名、公证和验证。正式 APP 已安装;新效果的原生宿主视觉仍由用户实测。原理与边界见 [V 脸下颌区域修复](docs/analysis/V脸下颌区域修复.md)。
## 开发和恢复
+1 -1
查看文件
@@ -120,4 +120,4 @@ GitHub 远端 `https://github.com/FAMEDaYu/FCP-BeatyGril.git` 已完成完整历
签名源码完整 SHA 为 `7fa3298e022946e77dfd8cfba1bb5ff2c2a6361f`,APP 1.3.1(16),分支 `codex/v-face-jaw-fix`。origin 与 github 同名分支已推送并回读一致。已从 origin 独立克隆该节点,219个受跟踪文件字节和执行位一致、strict/full fsck及Xcode工程读取通过,无LFS或子模块;见 `docs/verification/v1.3.1/recovery-verification.json`。恢复依赖和签名入口沿用本文现有配置,用户帧和私钥不作为源码依赖保存。
V 脸现在为四组下颌到外唇局部 pin,映射为 V×0.065,无新版目标已取消的旧尺寸增益。此前瘦脸/下巴/短脸/下颌骨仍保留旧版本映射,大眼/窄脸/颧骨/小头和整体组合保留近似边界。1901项全套及1561项重叠真实帧几何ASan通过。Apple公证 Accepted `e353b701-2fc2-4fcc-b03e-69af7735400f`、staple/validate通过;当前等待用户保存并退出两个宿主,正式安装仍为1.3.0。完成状态以同版本交付回执和验证记录为准。
V 脸现在为四组下颌到外唇局部 pin,映射为 V×0.065,无新版目标已取消的旧尺寸增益。此前瘦脸/下巴/短脸/下颌骨仍保留旧版本映射,大眼/窄脸/颧骨/小头和整体组合保留近似边界。1901项全套及1561项重叠真实帧几何ASan通过。Apple公证 Accepted `e353b701-2fc2-4fcc-b03e-69af7735400f`、staple/validate通过;已在用户确认退出宿主后完成1.3.1正式安装、身份/票据/注册核验和临时副本清理。后续FCP仍有后台进程,通过正常退出菜单结束后才替换APP。PKG由本机PKG工坊CLI制作,包含用户指定分类4项资源,Installer签名、公证Accepted 78105340-306f-4629-8670-772760d4cb9a、票据、Gatekeeper、载荷及隔离脚本均通过;详见同版本交付回执和验证记录。
@@ -0,0 +1,44 @@
{
"status": "installed_user_qa_pending",
"bundleIdentifier": "com.dayu.beatygril",
"installationPath": "/Library/Plug-Ins/FxPlug/beatygril.app",
"options": {
"waitForHosts": true,
"userTests": true
},
"nativeEffectQA": {
"status": "pending_user",
"performedByScript": false
},
"source": {
"commit": "7fa3298e022946e77dfd8cfba1bb5ff2c2a6361f",
"trackedWorktreeChanges": []
},
"updatedAt": "2026-10-22T08:52:41.382516+00:00",
"version": "1.3.1",
"build": "16",
"stagingSignature": "Executable=/private/tmp/paintfcp-build-20261021/Build/Products/Release/beatygril.app/Contents/MacOS/beatygril\nIdentifier=com.dayu.beatygril\nFormat=app bundle with Mach-O universal (x86_64 arm64)\nCodeDirectory v=20500 size=478 flags=0x10000(runtime) hashes=4+7 location=embedded\nHash type=sha256 size=32\nCandidateCDHash sha256=d3bf91f8c8589b1acc19779f5578cc4f4055d267\nCandidateCDHashFull sha256=d3bf91f8c8589b1acc19779f5578cc4f4055d2678f10767fbb5d935ffea426a6\nHash choices=sha256\nCMSDigest=d3bf91f8c8589b1acc19779f5578cc4f4055d2678f10767fbb5d935ffea426a6\nCMSDigestType=2\nCDHash=d3bf91f8c8589b1acc19779f5578cc4f4055d267\nSignature size=8968\nAuthority=Developer ID Application: zhong luo (B3W25FX5H5)\nAuthority=Developer ID Certification Authority\nAuthority=Apple Root CA\nTimestamp=Oct 22, 2026 at 16:27:24\nInfo.plist entries=22\nTeamIdentifier=B3W25FX5H5\nRuntime Version=27.0.0\nSealed Resources version=2 rules=13 files=5\nInternal requirements count=1 size=180\nTotal signatures=1\nChosen signature=1\n",
"notarization": {
"message": "Processing complete",
"status": "Accepted",
"id": "e353b701-2fc2-4fcc-b03e-69af7735400f"
},
"signingVerified": true,
"stapleValidated": true,
"stagingPluginUnregistered": true,
"runningHosts": [],
"installedSignature": "Executable=/Library/Plug-Ins/FxPlug/beatygril.app/Contents/MacOS/beatygril\nIdentifier=com.dayu.beatygril\nFormat=app bundle with Mach-O universal (x86_64 arm64)\nCodeDirectory v=20500 size=478 flags=0x10000(runtime) hashes=4+7 location=embedded\nHash type=sha256 size=32\nCandidateCDHash sha256=d3bf91f8c8589b1acc19779f5578cc4f4055d267\nCandidateCDHashFull sha256=d3bf91f8c8589b1acc19779f5578cc4f4055d2678f10767fbb5d935ffea426a6\nHash choices=sha256\nCMSDigest=d3bf91f8c8589b1acc19779f5578cc4f4055d2678f10767fbb5d935ffea426a6\nCMSDigestType=2\nCDHash=d3bf91f8c8589b1acc19779f5578cc4f4055d267\nSignature size=8968\nAuthority=Developer ID Application: zhong luo (B3W25FX5H5)\nAuthority=Developer ID Certification Authority\nAuthority=Apple Root CA\nTimestamp=Oct 22, 2026 at 16:27:24\nNotarization Ticket=stapled\nInfo.plist entries=22\nTeamIdentifier=B3W25FX5H5\nRuntime Version=27.0.0\nSealed Resources version=2 rules=13 files=5\nInternal requirements count=1 size=180\nTotal signatures=1\nChosen signature=1\n",
"installedSignatureVerified": true,
"installedStapleValidated": true,
"gatekeeperAccepted": true,
"pluginDiscovery": {
"bundleIdentifier": "com.dayu.beatygril.fxplug",
"formalPath": "/Library/Plug-Ins/FxPlug/beatygril.app/Contents/PlugIns/beatygril XPC Service.pluginkit",
"output": " com.dayu.beatygril.fxplug(1.1)\t330605B9-A653-4D3C-BB2D-D87F041A2071\t2026-10-22 08:52:41 +0000\t/Library/Plug-Ins/FxPlug/beatygril.app/Contents/PlugIns/beatygril XPC Service.pluginkit\n (1 plug-in)\n"
},
"removedGeneratedPaths": [
"/Users/dayu/Documents/PaintFCP/build/delivery/previous-beatygril.app",
"/tmp/paintfcp-build-20261021",
"/Users/dayu/Documents/PaintFCP/build/delivery/notarization.zip"
]
}
@@ -0,0 +1,40 @@
{
"status": "verified",
"date": "2026-10-22",
"installedProduct": {
"path": "/Library/Plug-Ins/FxPlug/beatygril.app",
"version": "1.3.1",
"build": "16"
},
"signatureAllArchitecturesVerified": true,
"duplicateInventory": {
"scope": "Listed local roots only; not a full scan of all mounted volumes.",
"roots": [
"/Applications",
"/Library/Plug-Ins/FxPlug",
"/Users/dayu/Library/Plug-Ins/FxPlug",
"/Users/dayu/Documents/PaintFCP",
"/Users/dayu/Desktop",
"/Users/dayu/Downloads",
"/Users/dayu/Library/Developer/Xcode/DerivedData",
"/tmp/paintfcp-build-20261021"
],
"products": [
{
"path": "/Library/Plug-Ins/FxPlug/beatygril.app",
"version": "1.3.1",
"build": "16"
}
],
"errors": []
},
"temporaryPathsRemoved": [
"/tmp/paintfcp-build-20261021",
"build/delivery/previous-beatygril.app",
"build/delivery/notarization.zip",
"build/release-input-1.3.1",
"build/pkg-expanded-1.3.1"
],
"nativeEffectQA": "pending_user",
"hostExit": "Motion exited by user; FCP remained running and was quit normally via UI after the user confirmed exit. No project edits."
}
@@ -0,0 +1,32 @@
{
"status": "verified",
"sourceApp": "/Library/Plug-Ins/FxPlug/beatygril.app",
"sourceCommit": "7fa3298e022946e77dfd8cfba1bb5ff2c2a6361f",
"motionSource": "/Users/dayu/Movies/Motion Templates.localized/Effects.localized/大鱼磨皮瘦脸",
"motionFiles": {
"大鱼人像美化.moef": "e9fa97dc14323d0daa7d3d61b06a78ba4000a70ab9f5e67ebffd750d49df1e15",
"Drop Zone.tiff": "a7f8e3a2a431dbb3ce9e777040bb55e701cfe9ab9632e8cbb10359732bc8692e",
"large.png": "a02ddb255b1ae255c749bb837a759e2dee1c3b8ffb9bdc1167957761bd5a1b97",
"small.png": "1552b838dd88f60dee0795e20aaca652f9c558ecefc93500e895fbff77c2a4d5"
},
"lockedFiles": [
"大鱼人像美化/large.png",
"大鱼人像美化/small.png"
],
"package": "releases/1.3.1/大鱼人像美化-1.3.1.pkg",
"bytes": 5011286,
"sha256": "a6bb7262c9066e7abca8d1f21eaeaf1ba6a1d0d51b4859d39307aa7d7b0bc927",
"notarization": {
"createdDate": "2026-10-22T08:54:34.655Z",
"message": "Successfully received submission info",
"id": "78105340-306f-4629-8670-772760d4cb9a",
"status": "Accepted",
"name": "大鱼人像美化-1.3.1.pkg"
},
"checks": {
"installerSignature": "Package \"大鱼人像美化-1.3.1.pkg\":\n Status: signed by a developer certificate issued by Apple for distribution\n Notarization: trusted by the Apple notary service\n Signed with a trusted timestamp on: 2026-10-22 08:54:32 +0000\n Certificate Chain:\n 1. Developer ID Installer: zhong luo (B3W25FX5H5)\n Expires: 2027-02-01 22:12:15 +0000\n SHA256 Fingerprint:\n 4D AC CD 04 A5 4C 7E F8 13 13 A2 ED D1 C2 C0 D0 29 EF FA BF 7B 53 \n 5A 43 C8 72 4D C4 0A A3 94 34\n ------------------------------------------------------------------------\n 2. Developer ID Certification Authority\n Expires: 2027-02-01 22:12:15 +0000\n SHA256 Fingerprint:\n 7A FC 9D 01 A6 2F 03 A2 DE 96 37 93 6D 4A FE 68 09 0D 2D E1 8D 03 \n F2 9C 88 CF B0 B1 BA 63 58 7F\n ------------------------------------------------------------------------\n 3. Apple Root CA\n Expires: 2035-02-09 21:40:36 +0000\n SHA256 Fingerprint:\n B0 B1 73 0E CB C7 FF 45 05 14 2C 49 F1 29 5E 6E DA 6B CA ED 7E 2C \n 68 C5 BE 91 B5 A1 10 01 F0 24\n\n",
"ticket": "Processing: /Users/dayu/Documents/PaintFCP/releases/1.3.1/大鱼人像美化-1.3.1.pkg\nThe validate action worked!\n",
"gatekeeper": "/Users/dayu/Documents/PaintFCP/releases/1.3.1/大鱼人像美化-1.3.1.pkg: accepted\nsource=Notarized Developer ID\norigin=Developer ID Installer: zhong luo (B3W25FX5H5)\n"
},
"realInstallerExecuted": false
}
@@ -0,0 +1,114 @@
{
"logFormatVersion": 1,
"jobId": "78105340-306f-4629-8670-772760d4cb9a",
"status": "Accepted",
"statusSummary": "Ready for distribution",
"statusCode": 0,
"archiveFilename": "大鱼人像美化-1.3.1.pkg",
"uploadDate": "2026-10-22T08:54:36.516Z",
"sha256": "e64eda56bedc889bdab4759ad5118beaa83e56aaa92d24c7f96fe993caaa10ff",
"ticketContents": [
{
"path": "大鱼人像美化-1.3.1.pkg/Payload.pkg Contents/Payload/Library/Plug-Ins/FxPlug/beatygril.app",
"digestAlgorithm": "SHA-256",
"cdhash": "70b387db43f4fd65efc5ebd5f1795f72561dc523",
"arch": "x86_64"
},
{
"path": "大鱼人像美化-1.3.1.pkg/Payload.pkg Contents/Payload/Library/Plug-Ins/FxPlug/beatygril.app",
"digestAlgorithm": "SHA-256",
"cdhash": "d3bf91f8c8589b1acc19779f5578cc4f4055d267",
"arch": "arm64"
},
{
"path": "大鱼人像美化-1.3.1.pkg/Payload.pkg Contents/Payload/Library/Plug-Ins/FxPlug/beatygril.app/Contents/PlugIns/beatygril XPC Service.pluginkit",
"digestAlgorithm": "SHA-256",
"cdhash": "00d0b69489a21f9c4464b38d284a0b8be7fd73c3",
"arch": "x86_64"
},
{
"path": "大鱼人像美化-1.3.1.pkg/Payload.pkg Contents/Payload/Library/Plug-Ins/FxPlug/beatygril.app/Contents/PlugIns/beatygril XPC Service.pluginkit",
"digestAlgorithm": "SHA-256",
"cdhash": "8411931c0e2f6fd7b21a168a268b641808cdb558",
"arch": "arm64"
},
{
"path": "大鱼人像美化-1.3.1.pkg/Payload.pkg Contents/Payload/Library/Plug-Ins/FxPlug/beatygril.app/Contents/PlugIns/beatygril XPC Service.pluginkit/Contents/Frameworks/FxPlug.framework/Versions/Current",
"digestAlgorithm": "SHA-256",
"cdhash": "54cf6701245852c5c86f0c664fae4ce99f3e9346",
"arch": "x86_64"
},
{
"path": "大鱼人像美化-1.3.1.pkg/Payload.pkg Contents/Payload/Library/Plug-Ins/FxPlug/beatygril.app/Contents/PlugIns/beatygril XPC Service.pluginkit/Contents/Frameworks/FxPlug.framework/Versions/Current",
"digestAlgorithm": "SHA-256",
"cdhash": "0eb927b742d37499cd49b950b2c88dca9af31987",
"arch": "arm64"
},
{
"path": "大鱼人像美化-1.3.1.pkg/Payload.pkg Contents/Payload/Library/Plug-Ins/FxPlug/beatygril.app/Contents/PlugIns/beatygril XPC Service.pluginkit/Contents/Frameworks/PluginManager.framework/Versions/Current",
"digestAlgorithm": "SHA-256",
"cdhash": "b018110c18ea61de312c47ca584e020d6e307bfd",
"arch": "x86_64"
},
{
"path": "大鱼人像美化-1.3.1.pkg/Payload.pkg Contents/Payload/Library/Plug-Ins/FxPlug/beatygril.app/Contents/PlugIns/beatygril XPC Service.pluginkit/Contents/Frameworks/PluginManager.framework/Versions/Current",
"digestAlgorithm": "SHA-256",
"cdhash": "26bcc6c218f15e8d6c96eec52104de495b8de2ff",
"arch": "arm64"
},
{
"path": "大鱼人像美化-1.3.1.pkg/Payload.pkg Contents/Payload/Library/Plug-Ins/FxPlug/beatygril.app/Contents/MacOS/beatygril",
"digestAlgorithm": "SHA-256",
"cdhash": "70b387db43f4fd65efc5ebd5f1795f72561dc523",
"arch": "x86_64"
},
{
"path": "大鱼人像美化-1.3.1.pkg/Payload.pkg Contents/Payload/Library/Plug-Ins/FxPlug/beatygril.app/Contents/MacOS/beatygril",
"digestAlgorithm": "SHA-256",
"cdhash": "d3bf91f8c8589b1acc19779f5578cc4f4055d267",
"arch": "arm64"
},
{
"path": "大鱼人像美化-1.3.1.pkg/Payload.pkg Contents/Payload/Library/Plug-Ins/FxPlug/beatygril.app/Contents/PlugIns/beatygril XPC Service.pluginkit/Contents/MacOS/beatygril XPC Service",
"digestAlgorithm": "SHA-256",
"cdhash": "00d0b69489a21f9c4464b38d284a0b8be7fd73c3",
"arch": "x86_64"
},
{
"path": "大鱼人像美化-1.3.1.pkg/Payload.pkg Contents/Payload/Library/Plug-Ins/FxPlug/beatygril.app/Contents/PlugIns/beatygril XPC Service.pluginkit/Contents/MacOS/beatygril XPC Service",
"digestAlgorithm": "SHA-256",
"cdhash": "8411931c0e2f6fd7b21a168a268b641808cdb558",
"arch": "arm64"
},
{
"path": "大鱼人像美化-1.3.1.pkg/Payload.pkg Contents/Payload/Library/Plug-Ins/FxPlug/beatygril.app/Contents/PlugIns/beatygril XPC Service.pluginkit/Contents/Frameworks/PluginManager.framework/Versions/B/PluginManager",
"digestAlgorithm": "SHA-256",
"cdhash": "b018110c18ea61de312c47ca584e020d6e307bfd",
"arch": "x86_64"
},
{
"path": "大鱼人像美化-1.3.1.pkg/Payload.pkg Contents/Payload/Library/Plug-Ins/FxPlug/beatygril.app/Contents/PlugIns/beatygril XPC Service.pluginkit/Contents/Frameworks/PluginManager.framework/Versions/B/PluginManager",
"digestAlgorithm": "SHA-256",
"cdhash": "26bcc6c218f15e8d6c96eec52104de495b8de2ff",
"arch": "arm64"
},
{
"path": "大鱼人像美化-1.3.1.pkg/Payload.pkg Contents/Payload/Library/Plug-Ins/FxPlug/beatygril.app/Contents/PlugIns/beatygril XPC Service.pluginkit/Contents/Frameworks/FxPlug.framework/Versions/A/FxPlug",
"digestAlgorithm": "SHA-256",
"cdhash": "54cf6701245852c5c86f0c664fae4ce99f3e9346",
"arch": "x86_64"
},
{
"path": "大鱼人像美化-1.3.1.pkg/Payload.pkg Contents/Payload/Library/Plug-Ins/FxPlug/beatygril.app/Contents/PlugIns/beatygril XPC Service.pluginkit/Contents/Frameworks/FxPlug.framework/Versions/A/FxPlug",
"digestAlgorithm": "SHA-256",
"cdhash": "0eb927b742d37499cd49b950b2c88dca9af31987",
"arch": "arm64"
},
{
"path": "大鱼人像美化-1.3.1.pkg",
"digestAlgorithm": "SHA-1",
"cdhash": "99c6067f2b58a458edfc534895b160317ba13c65"
}
],
"issues": null
}
@@ -0,0 +1,36 @@
{
"package": "releases/1.3.1/大鱼人像美化-1.3.1.pkg",
"bytes": 5011286,
"sha256": "a6bb7262c9066e7abca8d1f21eaeaf1ba6a1d0d51b4859d39307aa7d7b0bc927",
"version": "1.3.1",
"build": "16",
"app_files_compared": 34,
"app_byte_and_symlink_equality": true,
"template_files": {
"大鱼人像美化.moef": "e9fa97dc14323d0daa7d3d61b06a78ba4000a70ab9f5e67ebffd750d49df1e15",
"Drop Zone.tiff": "a7f8e3a2a431dbb3ce9e777040bb55e701cfe9ab9632e8cbb10359732bc8692e",
"large.png": "a02ddb255b1ae255c749bb837a759e2dee1c3b8ffb9bdc1167957761bd5a1b97",
"small.png": "1552b838dd88f60dee0795e20aaca652f9c558ecefc93500e895fbff77c2a4d5"
},
"locked_relative_paths": [
"大鱼人像美化/large.png",
"大鱼人像美化/small.png"
],
"script_sha256": {
"preinstall": "b0562f7705c84a2f34e31df67a4f0d429e60083bab122dad99f56a4b266c0174",
"postinstall": "f7a1cedbac82d8c7946adc4767d253268bf5e9bbf6aa5b492264f6965092fccb"
},
"isolated_script_tests": [
"fresh install",
"replace old locked thumbnail",
"partial copy failure restores old bytes and locks"
],
"isolation_changes": [
"Console identity/home redirected to task fixture",
"chown replaced with true",
"FxPlug verification skipped; formal app signature and discovery verified separately"
],
"real_installer_execution": false,
"app_and_template_installed": "APP installed through signed delivery workflow; formal template files matched the specified installed category, not changed by running this PKG",
"fonts": "No editable third-party font dependency; promotional lettering baked into PNG. No optional font ZIP needed."
}
+27
查看文件
@@ -0,0 +1,27 @@
识别到 2 个安装内容:
- beatygril.app
类型:FxPlug 插件
目录:/Library/Plug-Ins/FxPlug
状态:已签名并公证,保留隔离属性,自动验证并修复注册;失败时打开 APP 所在目录
- 大鱼磨皮瘦脸
类型:FCP 效果
目录:~/Movies/Motion Templates.localized/Effects.localized
状态:非 APP,保留隔离属性
本次唯一标识:com.dayu.fcppackage.b20261022085430796.tqa79fqb
安装包版本:1.3.1(继承 beatygril.app)
[正在准备内容]
正在整理 2 个内容项
[正在生成安装包]
正在构建组件包
[正在签名]
正在使用 Developer ID Installer 签名
[正在等待 Apple 公证]
已提交 Apple,公证通常需要几分钟
[正在粘附公证票据]
公证已通过,正在粘附票据
[正在验证结果]
正在检查签名和安装包结构
签名、包结构与公证票据验证通过
完成:/Users/dayu/Documents/PaintFCP/releases/1.3.1/大鱼人像美化-1.3.1.pkg
+3 -5
查看文件
@@ -2,9 +2,7 @@
更新时间:2026-10-22,Asia/Shanghai。项目根目录:`/Users/dayu/Documents/PaintFCP`。
**1.3.1(16)** 的 V 脸下颌修复已通过1901项自动检查、正式签名、Apple公证和票据验证,正在等待用户保存退出Motion/FCP再安装。签名源码为 `7fa3298e022946e77dfd8cfba1bb5ff2c2a6361f`,两个远端分支 `codex/v-face-jaw-fix` 已保存并读回核验。
当前正式安装的 APP 为 **1.3.0(构建 15)**,已完成通用 Release 编译、正式签名、Apple 公证、票据验证及唯一正式路径安装。新增磨皮参数迁移与 1636 项自动检查已完成,原生效果视觉仍待用户实测。公开文章、PKG 与 GitHub Release 继续对应 **1.2.0**;本次未更新这些发行资料,也未覆盖模板或宣传图。
当前正式 APP 为 **1.3.1(16)**,通用 Release、正式签名、Apple公证、票据、Gatekeeper和正式路径注册均已核验,临时APP副本已清理。1901项自动回归及1561项重叠真实帧几何ASan通过,V脸和新磨皮参数的最终宿主视觉仍由用户实测。签名源码 `7fa3298e022946e77dfd8cfba1bb5ff2c2a6361f`;本次PKG由本机PKG工坊CLI打包,包含用户指定已安装的「大鱼磨皮瘦脸」分类及4项模板资源。文章与双远端发行同步状态见本版本回执。
代码由 **OpenAI + Codex 全程编写,站长仅参与调试和测试**。文章和仓库须保留这个表述,不使用“站长原创代码”等说法。免费版本无需账号、激活码或付费授权;“自动注册”指系统插件注册。
@@ -18,7 +16,7 @@
| 入口 | 用途 |
| --- | --- |
| [1.3.0 交付回执](verification/v1.3.0/delivery-receipt.json) | 当前安装版、签名源码、公证、清理及原生视觉待测范围 |
| [1.3.1 交付回执](verification/v1.3.1/delivery-receipt.json) | 当前安装版、签名源码、公证、清理及原生视觉待测范围 |
| [README](../README.md) | 产品介绍、使用与版本变化 |
| [恢复说明](../RECOVERY.md) | 精确源码节点、依赖、远端恢复记录 |
| [GitHub 同步说明](GitHub同步说明.md) | 两个远端、公开克隆及 Release 验证 |
@@ -33,7 +31,7 @@
| --- | --- |
| 显示名称 | 大鱼人像美化 |
| Xcode 产品名 | `beatygril`,保留现有拼写 |
| APP 版本 | `1.3.0` / `15`,arm64 与 x86_64 通用版本 |
| APP 版本 | `1.3.1` / `16`,arm64 与 x86_64 通用版本 |
| 唯一正式 APP | `/Library/Plug-Ins/FxPlug/beatygril.app` |
| 主 Bundle ID | `com.dayu.beatygril` |
| 嵌套插件 | `Contents/PlugIns/beatygril XPC Service.pluginkit` |
+4 -2
查看文件
@@ -140,6 +140,8 @@ Motion:独立普通视频项目,源PTS0、1920×1080/25fps/10秒,媒体通
通用 Release 正式签名、公证 Accepted(`ca96837f-bf33-44fa-8d58-799026ce5c7d`)、票据、双架构严格签名、安装身份、Gatekeeper、PluginKit 正式路径与临时副本清理通过。独立从 origin 克隆签名源码节点,205 个受跟踪文件逐字节匹配且 strict/full fsck 通过。本次没有原生新滑杆/效果视觉验收,也没有生成新 PKG 或更新文章;用户已保存并退出宿主后才执行安装。详见 `verification/v1.3.0/` 与 `analysis/新版磨皮参数迁移.md`。
## 1.3.1(16)V 脸下颌区域修复(构建前)
## 1.3.1(16)V 脸下颌区域修复与正式交付
移除 V 脸的脸框近似宽带,改为新版目标的四组下颌到外唇 pin,单项映射为 clamp(V,0,1)×0.065,不叠加旧尺寸增益。无合法76点时直通,图像与四张蒙版同场变形。1901项自动检查通过:57 Beauty、116 Face、1033几何、370 Host ASan、98 OSC ASan、227 Inspector ASan。原失败复现、点位/CPU/AIR证据和未对齐范围见 analysis/V脸下颌区域修复.md。另对 NASA 人像和本机用户视频11帧运行1561项几何ASan专项(含重复基础用例,不相加),通过;用户帧和完整点坐标未上传。安装及用户视觉待完成,当前正式APP仍为1.3.0。
移除 V 脸的脸框近似宽带,改为新版目标的四组下颌到外唇 pin,单项映射为 clamp(V,0,1)×0.065,不叠加旧尺寸增益。无合法76点时直通,图像与四张蒙版同场变形。1901项自动检查通过:57 Beauty、116 Face、1033几何、370 Host ASan、98 OSC ASan、227 Inspector ASan。原失败复现、点位/CPU/AIR证据和未对齐范围见 analysis/V脸下颌区域修复.md。另对 NASA 人像和本机用户视频11帧运行1561项几何ASan专项(含重复基础用例,不相加),通过;用户帧和完整点坐标未上传。正式APP已安装,严格签名/双架构、票据、Gatekeeper、PluginKit正式路径及有界副本扫描通过,用户视觉仍待实测。APP公证Accepted e353b701-2fc2-4fcc-b03e-69af7735400f。
PKG由本机PKG工坊CLI从正式APP与用户指定已安装的「大鱼磨皮瘦脸」分类发布副本生成,含1个moef、Drop Zone.tiff和两张锁定缩略图。Installer签名、公证Accepted 78105340-306f-4629-8670-772760d4cb9a、票据、Gatekeeper、包内APP34个文件/链接与正式版一致、4模板资源、隔离新装/更新锁图/失败回滚均通过。本次未运行PKG安装器覆盖模板;正式APP通过交付脚本安装,模板保持原用户副本。PKG 5,011,286 bytes,SHA256 a6bb7262c9066e7abca8d1f21eaeaf1ba6a1d0d51b4859d39307aa7d7b0bc927。
+17
查看文件
@@ -0,0 +1,17 @@
# 大鱼人像美化 1.3.1(16)
修复V脸作用区域,改为四组实际下颌轮廓到外唇的局部采样;同时包含1.3.0的微细锐化、连续五官保护与非肤色区保护。1901项自动回归通过,另有1561项重叠真实帧几何ASan检查;新效果在原生宿主中的最终视觉仍待用户结合素材实测。
- 文章:https://dayu.media/15593/
- GitHub:https://github.com/FAMEDaYu/FCP-BeatyGril
- 大鱼备份:https://dayu.media/git/dayu/paintfcp-fxplug
- 发布标签:v1.3.1
- 正式APP源码:7fa3298e022946e77dfd8cfba1bb5ff2c2a6361f
- APP公证:Accepted e353b701-2fc2-4fcc-b03e-69af7735400f
- PKG公证:Accepted 78105340-306f-4629-8670-772760d4cb9a
- PKG:大鱼人像美化-1.3.1.pkg,5,011,286 bytes
- SHA-256:a6bb7262c9066e7abca8d1f21eaeaf1ba6a1d0d51b4859d39307aa7d7b0bc927
由本机PKG工坊CLI制作,APP来自唯一正式路径,模板来自用户指定的已安装分类「大鱼磨皮瘦脸」。包含「大鱼人像美化.moef」、Drop Zone.tiff、large.png和small.png;两张缩略图的锁定由安装脚本恢复。PKG签名、公证票据、Gatekeeper、载荷逐字节及隔离脚本测试通过,未实际运行本PKG安装器。APP已通过正式交付流程安装到/Library/Plug-Ins/FxPlug/beatygril.app。
安装前退出FCP/Motion;FCP在效果→大鱼磨皮瘦脸→大鱼人像美化中使用。免费开源,无需激活码。代码由OpenAI + Codex全程编写,站长仅参与调试和测试。Apple SDK及相关资源遵循各自许可。
+47
查看文件
@@ -0,0 +1,47 @@
{
"title": "大鱼人像美化 1.3.1:FCP / Motion 免费开源自动美颜插件",
"status": "publish",
"content": "<!-- wp:paragraph -->\n<p>大鱼人像美化是一款适用于 Final Cut Pro 与 Motion 的免费开源人像插件,把磨皮、美白和脸型调整放进同一块原生卡片面板。插件会识别当前画面中的人脸并自动跟随,无需先点击分析;你可以按素材需要调整强度,拖动滑杆时持续查看效果。</p>\n<!-- /wp:paragraph -->\n<!-- wp:paragraph -->\n<p><strong>代码由 OpenAI + Codex 全程编写,站长仅参与调试和测试。</strong></p>\n<!-- /wp:paragraph -->\n\n<!-- wp:image {\"sizeSlug\":\"full\"} -->\n<figure class=\"wp-block-image size-full\"><img src=\"https://dayu.media/wp-content/uploads/2026/10/1792604750-357ca780597c39f.png\" alt=\"大鱼人像美化古风宣传封面,展示自动瘦脸、自动跟随与自动美颜\" /><figcaption class=\"wp-element-caption\">古风宣传插画;面部线条用于示意瘦脸与跟随功能。</figcaption></figure>\n<!-- /wp:image -->\n\n<!-- wp:heading -->\n<h2 class=\"wp-block-heading\">可以做什么</h2>\n<!-- /wp:heading -->\n\n<!-- wp:list {\"className\":\"wp-block-list\"} -->\n<ul class=\"wp-block-list\"><!-- wp:list-item -->\n<li>磨皮:磨皮程度、微细锐化、五官保护和非肤色区保护分别调节;全局磨皮与锐化保留在更多设置。</li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li>美白:肤色预设、肤色亮度、皮肤色相和牙齿美白。</li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li>脸型:瘦脸、大眼、短脸、窄脸、下巴、V 脸、下颌骨、颧骨与小头调整。</li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li>自动跟随:默认跟随主要人脸,也提供多人模式、防跳脸范围与检测框预览。</li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li>实时预览:滑杆、数值、单项开关和重置集中在同一面板,便于反复对比。</li>\n<!-- /wp:list-item --></ul>\n<!-- /wp:list -->\n\n<!-- wp:paragraph -->\n<p>自动识别负责定位处理区域,效果强度由你控制。建议先从较小的数值开始;多人交叉、严重遮挡和极端侧脸的结果需要结合具体素材检查。</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:heading -->\n<h2 class=\"wp-block-heading\">版本与下载</h2>\n<!-- /wp:heading -->\n\n<!-- wp:paragraph -->\n<p>当前版本 <strong>1.3.1(16)</strong>,支持 macOS 13 或更高版本,包含 Apple Silicon 与 Intel 两种架构。下载包包含 FxPlug4 程序和一个配套 FCP 效果模板。APP 与 PKG 均已完成 Developer ID 正式签名、Apple 公证和票据粘附;安装包为所有用户免费资源。</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p>1.3.1 修复 V 脸影响眼区的问题,改为沿实际下颌轮廓进行局部调整;同时包含 1.3.0 新增的微细锐化、连续五官保护和非肤色区保护。两项保护默认 100%,支持旧工程参数。1901 项自动检查通过,另有真实帧几何检查;新参数及 V 脸在原生宿主中的最终视觉效果仍需结合素材实测。</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:heading -->\n<h2 class=\"wp-block-heading\">安装</h2>\n<!-- /wp:heading -->\n\n<!-- wp:paragraph -->\n<p>安装前先保存工作并退出 Final Cut Pro 和 Motion,安装期间保持关闭。运行本页提供的 PKG,按安装器提示完成安装;它会把程序安装到 <code>/Library/Plug-Ins/FxPlug/beatygril.app</code>,把配套效果安装到当前登录用户的 Motion Templates 目录,并自动验证和修复系统插件注册。</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p>本插件免费开源,<strong>无需激活码、付费注册或账号授权</strong>。主 APP 打开时显示说明图,窗口显示三秒后自动退出;宿主中的滤镜由独立服务运行。安装器还会重新锁定两张缩略图,避免被宿主自动替换。</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:image {\"sizeSlug\":\"full\"} -->\n<figure class=\"wp-block-image size-full\"><img src=\"https://dayu.media/wp-content/uploads/2026/10/1792604743-1c99c2ba53c7614.png\" alt=\"主程序说明页:免费开源,自动注册,无需激活码,启动三秒后自动退出\" /></figure>\n<!-- /wp:image -->\n\n<!-- wp:heading -->\n<h2 class=\"wp-block-heading\">使用</h2>\n<!-- /wp:heading -->\n\n<!-- wp:paragraph -->\n<p>Final Cut Pro:打开<strong>效果</strong>浏览器,找到<strong>大鱼磨皮瘦脸</strong>分类,将<strong>大鱼人像美化</strong>添加到人像片段。Motion:在原生滤镜资源库的<strong>大鱼</strong>分类中选择<strong>大鱼人像美化</strong>。</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p>在检查器中按需调节磨皮、美白和脸型。每项左侧的眼睛可暂时停用该项,数值会保留;右侧回转箭头用于重置。人脸会随画面自动更新,开启检测框预览可以检查跟随位置。多人模式建议先用短片段观察稳定性。</p>\n<!-- /wpLine truncated
"excerpt": "1.3.1 修复 V 脸下颌作用区域,新增微细锐化、五官保护与非肤色区保护。免费开源,提供签名公证安装包及源码。",
"resource": {
"cao_status": true,
"cao_price": 0,
"cao_vip_rate": 1,
"cao_info": [
{
"title": "版本",
"desc": "1.3.1(16)"
},
{
"title": "宿主",
"desc": "Final Cut Pro / Motion"
},
{
"title": "系统",
"desc": "macOS 13 或更高版本"
},
{
"title": "架构",
"desc": "Apple Silicon / Intel"
},
{
"title": "授权",
"desc": "免费开源,无需激活码"
}
]
},
"seo": {
"title": {
"enabled": true,
"value": "大鱼人像美化 1.3.1|FCP / Motion 免费开源自动美颜插件"
},
"description": {
"enabled": true,
"value": "大鱼人像美化是适用于 Final Cut Pro 和 Motion 的免费开源 FxPlug4 插件,1.3.1 修复 V 脸下颌作用区域,并加入微细锐化、五官保护与非肤色区保护。提供 Apple 签名公证 PKG 安装包和源码,安装自动注册,无需激活码,附安装使用及故障排查说明。"
},
"keywords": {
"enabled": true,
"value": "大鱼人像美化,FCP美颜插件,Motion磨皮,自动瘦脸,自动跟随,FxPlug4,免费开源"
}
}
}
+112
查看文件
@@ -0,0 +1,112 @@
<!-- wp:paragraph -->
<p>大鱼人像美化是一款适用于 Final Cut Pro 与 Motion 的免费开源人像插件,把磨皮、美白和脸型调整放进同一块原生卡片面板。插件会识别当前画面中的人脸并自动跟随,无需先点击分析;你可以按素材需要调整强度,拖动滑杆时持续查看效果。</p>
<!-- /wp:paragraph -->
<!-- wp:paragraph -->
<p><strong>代码由 OpenAI + Codex 全程编写,站长仅参与调试和测试。</strong></p>
<!-- /wp:paragraph -->
<!-- wp:image {"sizeSlug":"full"} -->
<figure class="wp-block-image size-full"><img src="https://dayu.media/wp-content/uploads/2026/10/1792604750-357ca780597c39f.png" alt="大鱼人像美化古风宣传封面,展示自动瘦脸、自动跟随与自动美颜" /><figcaption class="wp-element-caption">古风宣传插画;面部线条用于示意瘦脸与跟随功能。</figcaption></figure>
<!-- /wp:image -->
<!-- wp:heading -->
<h2 class="wp-block-heading">可以做什么</h2>
<!-- /wp:heading -->
<!-- wp:list {"className":"wp-block-list"} -->
<ul class="wp-block-list"><!-- wp:list-item -->
<li>磨皮:磨皮程度、微细锐化、五官保护和非肤色区保护分别调节;全局磨皮与锐化保留在更多设置。</li>
<!-- /wp:list-item -->
<!-- wp:list-item -->
<li>美白:肤色预设、肤色亮度、皮肤色相和牙齿美白。</li>
<!-- /wp:list-item -->
<!-- wp:list-item -->
<li>脸型:瘦脸、大眼、短脸、窄脸、下巴、V 脸、下颌骨、颧骨与小头调整。</li>
<!-- /wp:list-item -->
<!-- wp:list-item -->
<li>自动跟随:默认跟随主要人脸,也提供多人模式、防跳脸范围与检测框预览。</li>
<!-- /wp:list-item -->
<!-- wp:list-item -->
<li>实时预览:滑杆、数值、单项开关和重置集中在同一面板,便于反复对比。</li>
<!-- /wp:list-item --></ul>
<!-- /wp:list -->
<!-- wp:paragraph -->
<p>自动识别负责定位处理区域,效果强度由你控制。建议先从较小的数值开始;多人交叉、严重遮挡和极端侧脸的结果需要结合具体素材检查。</p>
<!-- /wp:paragraph -->
<!-- wp:heading -->
<h2 class="wp-block-heading">版本与下载</h2>
<!-- /wp:heading -->
<!-- wp:paragraph -->
<p>当前版本 <strong>1.3.1(16)</strong>,支持 macOS 13 或更高版本,包含 Apple Silicon 与 Intel 两种架构。下载包包含 FxPlug4 程序和一个配套 FCP 效果模板。APP 与 PKG 均已完成 Developer ID 正式签名、Apple 公证和票据粘附;安装包为所有用户免费资源。</p>
<!-- /wp:paragraph -->
<!-- wp:paragraph -->
<p>1.3.1 修复 V 脸影响眼区的问题,改为沿实际下颌轮廓进行局部调整;同时包含 1.3.0 新增的微细锐化、连续五官保护和非肤色区保护。两项保护默认 100%,支持旧工程参数。1901 项自动检查通过,另有真实帧几何检查;新参数及 V 脸在原生宿主中的最终视觉效果仍需结合素材实测。</p>
<!-- /wp:paragraph -->
<!-- wp:heading -->
<h2 class="wp-block-heading">安装</h2>
<!-- /wp:heading -->
<!-- wp:paragraph -->
<p>安装前先保存工作并退出 Final Cut Pro 和 Motion,安装期间保持关闭。运行本页提供的 PKG,按安装器提示完成安装;它会把程序安装到 <code>/Library/Plug-Ins/FxPlug/beatygril.app</code>,把配套效果安装到当前登录用户的 Motion Templates 目录,并自动验证和修复系统插件注册。</p>
<!-- /wp:paragraph -->
<!-- wp:paragraph -->
<p>本插件免费开源,<strong>无需激活码、付费注册或账号授权</strong>。主 APP 打开时显示说明图,窗口显示三秒后自动退出;宿主中的滤镜由独立服务运行。安装器还会重新锁定两张缩略图,避免被宿主自动替换。</p>
<!-- /wp:paragraph -->
<!-- wp:image {"sizeSlug":"full"} -->
<figure class="wp-block-image size-full"><img src="https://dayu.media/wp-content/uploads/2026/10/1792604743-1c99c2ba53c7614.png" alt="主程序说明页:免费开源,自动注册,无需激活码,启动三秒后自动退出" /></figure>
<!-- /wp:image -->
<!-- wp:heading -->
<h2 class="wp-block-heading">使用</h2>
<!-- /wp:heading -->
<!-- wp:paragraph -->
<p>Final Cut Pro:打开<strong>效果</strong>浏览器,找到<strong>大鱼磨皮瘦脸</strong>分类,将<strong>大鱼人像美化</strong>添加到人像片段。Motion:在原生滤镜资源库的<strong>大鱼</strong>分类中选择<strong>大鱼人像美化</strong>。</p>
<!-- /wp:paragraph -->
<!-- wp:paragraph -->
<p>在检查器中按需调节磨皮、美白和脸型。每项左侧的眼睛可暂时停用该项,数值会保留;右侧回转箭头用于重置。人脸会随画面自动更新,开启检测框预览可以检查跟随位置。多人模式建议先用短片段观察稳定性。</p>
<!-- /wp:paragraph -->
<!-- wp:heading -->
<h2 class="wp-block-heading">常见问题</h2>
<!-- /wp:heading -->
<!-- wp:paragraph -->
<p>如果效果没有出现或显示红色警告,先退出 Final Cut Pro 和 Motion,再打开一次主 APP,等待其自动退出,然后重新启动宿主。可在“终端”执行下面这条命令:</p>
<!-- /wp:paragraph -->
<!-- wp:code -->
<pre class="wp-block-code"><code>open '/Library/Plug-Ins/FxPlug/beatygril.app'</code></pre>
<!-- /wp:code -->
<!-- wp:paragraph -->
<p>该流程可重新触发系统注册,并不能解决所有报错。仍异常时请核对 macOS、宿主版本及安装包完整性;不要只复制单个 .moef 文件,配套程序与 Drop Zone.tiff 也需要保留。当前仅提供上述一个效果模板。</p>
<!-- /wp:paragraph -->
<!-- wp:heading -->
<h2 class="wp-block-heading">源码与开源许可</h2>
<!-- /wp:heading -->
<!-- wp:paragraph -->
<p>公开源码仓库:<a href="https://github.com/FAMEDaYu/FCP-BeatyGril" target="_blank" rel="noreferrer noopener">GitHub · FCP-BeatyGril</a>,可直接浏览源码、完整提交历史和版本标签。<a href="https://github.com/FAMEDaYu/FCP-BeatyGril/releases/tag/v1.3.1" target="_blank" rel="noreferrer noopener">1.3.1 Release</a> 提供正式签名公证安装包。大鱼站仓库作为备份保留:<a href="https://dayu.media/git/dayu/paintfcp-fxplug" target="_blank" rel="noreferrer noopener">paintfcp-fxplug</a>(该入口仍受站点登录与会员网关限制)。也可下载 <a href="{{source_url}}">1.3.1 源码快照 ZIP</a>,源码与安装包均免费提供。</p>
<!-- /wp:paragraph -->
<!-- wp:paragraph -->
<p>项目代码按仓库中的 MIT 许可文件提供,源码包含 Xcode 工程、Objective-C / Metal 实现、模板及构建与验证说明。Apple SDK、运行框架及样本按各自许可使用,详见源码中的 LICENSE 和 THIRD_PARTY_NOTICES.md。自行编译需要 Xcode 与 FxPlug SDK;证书和签名私钥不包含在源码中。</p>
<!-- /wp:paragraph -->
<!-- wp:image {"id":15597,"sizeSlug":"large","linkDestination":"none"} -->
<figure class="wp-block-image size-large"><img src="https://dayu.media/wp-content/uploads/2026/10/1792605142-78805a221a988e7-359x1024.png" alt="" class="wp-image-15597" /></figure>
<!-- /wp:image -->
二进制文件未显示。
+99
查看文件
@@ -0,0 +1,99 @@
#!/usr/bin/env python3
"""Update the existing Dayu release article, retaining its cover and access rules.
Only --publish performs writes. Credentials stay in memory and go only to Dayu.
"""
import argparse, base64, hashlib, html, json, pathlib, ssl, subprocess, urllib.parse, urllib.request, uuid, zipfile
parser = argparse.ArgumentParser(description=__doc__)
parser.add_argument('--version', required=True)
parser.add_argument('--post-id', type=int, default=15593)
parser.add_argument('--publish', action='store_true')
args = parser.parse_args()
root = pathlib.Path(__file__).resolve().parent.parent
release = root / 'releases' / args.version
work = root / 'build' / ('publish-' + args.version)
work.mkdir(parents=True, exist_ok=True)
state_path = work / 'operation.json'
state = json.loads(state_path.read_text()) if state_path.exists() else {'idempotencyKey': str(uuid.uuid4())}
def save():
state_path.write_text(json.dumps(state, ensure_ascii=False, indent=2) + '\n')
save()
secret = subprocess.run(['security', 'find-generic-password', '-s', 'dayu-article-publisher', '-a', 'dayu', '-w'], text=True, capture_output=True, check=True).stdout.strip()
auth = 'Basic ' + base64.b64encode(('dayu:' + secret).encode()).decode()
class NoRedirect(urllib.request.HTTPRedirectHandler):
def redirect_request(self, *args, **kwargs):
return None
opener = urllib.request.build_opener(NoRedirect, urllib.request.HTTPSHandler(context=ssl.create_default_context(cafile='/etc/ssl/cert.pem')))
def request(path, method='GET', body=None, headers=None):
assert path.startswith(('/wp/v2/', '/dayu-publisher/v1/')) and '\n' not in path
h = {'Authorization': auth, 'Accept': 'application/json'}
h.update(headers or {})
if isinstance(body, dict):
body = json.dumps(body, ensure_ascii=False).encode()
h['Content-Type'] = 'application/json'
with opener.open(urllib.request.Request('https://dayu.media/wp-json' + path, data=body, headers=h, method=method), timeout=180) as response:
return json.load(response)
def public_bytes(url):
assert urllib.parse.urlparse(url).hostname == 'dayu.media'
with urllib.request.urlopen(url, context=ssl.create_default_context(cafile='/etc/ssl/cert.pem'), timeout=180) as response:
return response.read()
digest = lambda data: hashlib.sha256(data).hexdigest()
route = '/dayu-publisher/v1/posts/' + str(args.post_id)
status = request('/dayu-publisher/v1/status')
assert status['can_publish'] and status['can_upload'] and 'seo' in status['fields']
before = request(route)['article']
assert before['id'] == args.post_id and before['status'] == 'publish'
if not args.publish:
(work / 'article-before.json').write_text(json.dumps({'article': before}, ensure_ascii=False, indent=2) + '\n')
print(json.dumps({'id': before['id'], 'url': before['url'], 'status': before['status'], 'writePerformed': False}))
raise SystemExit(0)
baseline = json.loads((work / 'article-before.json').read_text())['article']
payload = json.loads((release / 'article-payload.json').read_text())
package = release / ('大鱼人像美化-' + args.version + '.pkg')
source = root / 'build' / ('Dayu-Portrait-' + args.version + '-source.zip')
with zipfile.ZipFile(source) as z:
assert z.testzip() is None and any(n.endswith('/Wrapper Application/AppDelegate.m') for n in z.namelist())
assert not any(n.endswith(('.app', '.pkg', '.p12', '.key', '.env')) for n in z.namelist())
operation_digest = digest(package.read_bytes() + source.read_bytes() + json.dumps(payload, sort_keys=True, ensure_ascii=False).encode())
assert state.get('digest', operation_digest) == operation_digest, 'Prepared release changed; use a new reviewed operation state'
state['digest'] = operation_digest
save()
if not state.get('response'):
assert before == baseline, 'Article changed since review; reconcile the current article first'
if 'source' not in state:
title = 'Dayu Portrait ' + args.version + ' source'
matches = request('/wp/v2/media?context=edit&per_page=100&search=' + urllib.parse.quote(title))
for item in matches:
if item['title'].get('raw', item['title'].get('rendered')) == title and digest(public_bytes(item['source_url'])) == digest(source.read_bytes()):
state['source'] = {'id': item['id'], 'url': item['source_url']}
break
if 'source' not in state:
item = request('/wp/v2/media?title=' + urllib.parse.quote(title), 'POST', source.read_bytes(), {'Content-Type': 'application/zip', 'Content-Disposition': 'attachment; filename="' + source.name + '"'})
state['source'] = {'id': item['id'], 'url': item['source_url']}
save()
assert digest(public_bytes(state['source']['url'])) == digest(source.read_bytes())
payload['content'] = payload['content'].replace('{{source_url}}', html.escape(state['source']['url'], quote=True))
assert '{{' not in payload['content']
if not state.get('response'):
boundary = 'DayuRelease' + state['idempotencyKey'].replace('-', '')
parts = []
for name, data, filename, mime in [('payload', json.dumps(payload, ensure_ascii=False).encode(), None, 'application/json'), ('package', package.read_bytes(), 'Dayu-Portrait-' + args.version + '.pkg', 'application/octet-stream')]:
head = '--' + boundary + '\r\nContent-Disposition: form-data; name="' + name + '"'
if filename:
head += '; filename="' + filename + '"'
parts.append((head + '\r\nContent-Type: ' + mime + '\r\n\r\n').encode() + data + b'\r\n')
state['response'] = request(route, 'POST', b''.join(parts) + ('--' + boundary + '--\r\n').encode(), {'Content-Type': 'multipart/form-data; boundary=' + boundary, 'Idempotency-Key': state['idempotencyKey']})
save()
after = request(route)['article']
for key in ['author', 'categories', 'tags', 'featured_media']:
assert after[key] == baseline[key], key
for key, value in baseline['resource'].items():
if key not in ['cao_downurl', 'cao_original_filename', 'cao_info']:
assert after['resource'][key] == value, key
assert after['status'] == 'publish' and after['title'] == payload['title']
assert after['seo'] == payload['seo'] and after['resource']['cao_info'] == payload['resource']['cao_info']
assert after['content'].count('<!-- wp:code -->') == 1
assert state['source']['url'] in after['content'] and ('/releases/tag/v' + args.version) in after['content']
assert digest(public_bytes(after['resource']['cao_downurl'])) == digest(package.read_bytes())
(work / 'article-after.json').write_text(json.dumps({'article': after}, ensure_ascii=False, indent=2) + '\n')
print(json.dumps({'id': after['id'], 'url': after['url'], 'status': after['status'], 'packageHashVerified': True, 'sourceHashVerified': True, 'coverAndAccessPreserved': True}, ensure_ascii=False))
+14 -6
查看文件
@@ -1,9 +1,15 @@
#!/usr/bin/env python3
"""Verify an expanded release payload and run template-only update/rollback in isolation."""
from pathlib import Path
import hashlib,json,os,plistlib,shutil,subprocess,sys
import argparse,hashlib,json,os,plistlib,shutil,subprocess,sys
root=Path(__file__).resolve().parent.parent
expanded=root/'build/pkg-expanded/Payload.pkg';payload=expanded/'Payload'
parser=argparse.ArgumentParser(description=__doc__)
parser.add_argument('--version',default='1.2.0')
parser.add_argument('--build',default='14')
parser.add_argument('--expanded',default='build/pkg-expanded')
parser.add_argument('--fixture',default='build/pkg-isolation')
args=parser.parse_args()
expanded=root/args.expanded/'Payload.pkg';payload=expanded/'Payload'
formal=Path('/Library/Plug-Ins/FxPlug/beatygril.app');packed=payload/'Library/Plug-Ins/FxPlug/beatygril.app'
sha=lambda p:hashlib.sha256(p.read_bytes()).hexdigest()
def files(p):
@@ -23,7 +29,7 @@ assert len(locks)==2 and any('/large.png' in l for l in locks) and any('/small.p
assert 'Template Backups' in post and 'restore_original_locks' in post
# Keep the exact generated functions and template body. Only identity lookup,
# chown and external FxPlug registration are replaced to confine execution.
base=root/'build/pkg-isolation';base.mkdir(exist_ok=False)
base=root/args.fixture;base.mkdir(exist_ok=False)
volume=base/'volume';home=base/'user';home.mkdir()
start=post.index('CURRENT_ACTIVE=0')
isolated='#!/bin/zsh\nset -eu\nTARGET_VOLUME="'+str(volume)+'"\nCONSOLE_USER="'+os.getlogin()+'"\nCONSOLE_UID="'+str(os.getuid())+'"\nCONSOLE_GROUP="staff"\nUSER_HOME="'+str(home)+'"\n'+post[start:]
@@ -60,8 +66,10 @@ assert files(final)==original
assert all((final/n).stat().st_flags & 2 for n in ['large.png','small.png'])
backups=list((home/'Library/Application Support/PKGForge/Template Backups').rglob('.locked-paths'))
assert backups and all('/Movies/' not in str(x) for x in backups)
package=root/'releases/1.2.0/大鱼人像美化-1.2.0.pkg'
report={'package':str(package.relative_to(root)),'bytes':package.stat().st_size,'sha256':sha(package),'version':'1.2.0','build':'14','app_files_compared':len(files(formal)),'app_byte_and_symlink_equality':True,'template_files':{n:sha(template/n) for n in runtime},'locked_relative_paths':['大鱼人像美化/large.png','大鱼人像美化/small.png'],'script_sha256':{'preinstall':sha(expanded/'Scripts/preinstall'),'postinstall':sha(expanded/'Scripts/postinstall')},'isolated_script_tests':['fresh install','replace old locked thumbnail','partial copy failure restores old bytes and locks'],'isolation_changes':['Console identity/home redirected to task fixture','chown replaced with true','FxPlug verification skipped; formal app signature and discovery verified separately'],'real_installer_execution':False,'app_and_template_installed':'APP installed through signed delivery workflow; user thumbnail directory updated separately, not by running this PKG','fonts':'No editable third-party font dependency; promotional lettering baked into PNG. No optional font ZIP needed.'}
(root/'docs/verification/v1.2.0/pkg-verification.json').write_text(json.dumps(report,ensure_ascii=False,indent=2)+'\n');print(json.dumps(report,ensure_ascii=False,indent=2))
package=root/('releases/'+args.version+'/大鱼人像美化-'+args.version+'.pkg')
info=plistlib.loads((packed/'Contents/Info.plist').read_bytes())
assert info['CFBundleShortVersionString']==args.version and info['CFBundleVersion']==args.build
report={'package':str(package.relative_to(root)),'bytes':package.stat().st_size,'sha256':sha(package),'version':args.version,'build':args.build,'app_files_compared':len(files(formal)),'app_byte_and_symlink_equality':True,'template_files':{n:sha(template/n) for n in runtime},'locked_relative_paths':['大鱼人像美化/large.png','大鱼人像美化/small.png'],'script_sha256':{'preinstall':sha(expanded/'Scripts/preinstall'),'postinstall':sha(expanded/'Scripts/postinstall')},'isolated_script_tests':['fresh install','replace old locked thumbnail','partial copy failure restores old bytes and locks'],'isolation_changes':['Console identity/home redirected to task fixture','chown replaced with true','FxPlug verification skipped; formal app signature and discovery verified separately'],'real_installer_execution':False,'app_and_template_installed':'APP installed through signed delivery workflow; formal template files matched the specified installed category, not changed by running this PKG','fonts':'No editable third-party font dependency; promotional lettering baked into PNG. No optional font ZIP needed.'}
(root/('docs/verification/v'+args.version+'/pkg-verification.json')).write_text(json.dumps(report,ensure_ascii=False,indent=2)+'\n');print(json.dumps(report,ensure_ascii=False,indent=2))
# This fixture belongs solely to this verifier; remove its locks before cleanup.
subprocess.run(['chflags','-R','nouchg',str(base)],check=True);shutil.rmtree(base)