diff --git a/CHANGELOG.md b/CHANGELOG.md index 12fa134..8592787 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -19,6 +19,12 @@ permissions. Update authenticity and independent security assurance are not claimed by these source and integrity checks. +## v0.24.1 — 2026-10-16 + +- Fix UTF-8 byte-position handling in the public privacy gate's fixed-policy span normalization. Multibyte prefixes can no longer shift a reviewed literal's exemption onto adjacent source content. +- Add positive and negative Unicode-prefix controls while preserving all existing privacy rules and the explicit package policy boundary. +- The installer, media runtime, capability scope, and bundled Cleanup provenance are unchanged from v0.24.0. + ## v0.23.0 (2026-08-27) ### Architecture cleanup and public release closure diff --git a/README.en.md b/README.en.md index 53dd6f4..4062bcb 100644 --- a/README.en.md +++ b/README.en.md @@ -1,6 +1,6 @@ # 🎬 video-autopilot-kit -> **v0.24.0 / architecture 7.0**: long-form, Shorts and Reels share a self-authored composition runtime, an Imagegen-first material gate, +> **v0.24.1 / architecture 7.0**: long-form, Shorts and Reels share a self-authored composition runtime, an Imagegen-first material gate, > evidence-gated cinematic craft and one 38-preset filter library. Camera, edit, sound, color, VFX and transitions fall back to a clean cut when shot evidence is missing. The 33-reference design DNA, tracking, Quality-95 review, publishing packages, outcome learning and safe updates for long-form, > Shorts and Reels. Run `python src/system_health.py --quick` to validate a clean install. Personal > media and analytics never enter the release. diff --git a/README.md b/README.md index f620448..39959fa 100644 --- a/README.md +++ b/README.md @@ -1,8 +1,8 @@ # 🎬 video-autopilot-kit -> Current version: v0.24.0 +> Current version: v0.24.1 > -> **v0.24.0/架構 7.0**:長片/Shorts/Reels 共用自研 composition runtime、Imagegen-first 材質閘門、證據式電影工藝、統一濾鏡庫與唯一發布中樞; +> **v0.24.1/架構 7.0**:長片/Shorts/Reels 共用自研 composition runtime、Imagegen-first 材質閘門、證據式電影工藝、統一濾鏡庫與唯一發布中樞; > 38 組調色/動態/轉場/主體濾鏡、33 圖設計 DNA、Tracking、Quality-95 審片、發佈包、成效學習與完整性檢查、確認後更新與回滾都在同一套公開版。沒有鏡頭證據時仍會退回乾淨切鏡。 > 執行 `python src/system_health.py --quick` 可驗證乾淨安裝;個人媒體與成效資料不會進 release。 diff --git a/release-manifest.json b/release-manifest.json index 348b2ac..5aa9106 100644 --- a/release-manifest.json +++ b/release-manifest.json @@ -1,7 +1,7 @@ { "schema_version": 1, "project_id": "video-autopilot-kit", - "version": "0.24.0", + "version": "0.24.1", "release_date": "2026-10-16T00:00:00Z", "license": "MIT", "python": ">=3.9", diff --git a/scripts/public_privacy_gate.py b/scripts/public_privacy_gate.py index 1499bed..5af2165 100644 --- a/scripts/public_privacy_gate.py +++ b/scripts/public_privacy_gate.py @@ -258,8 +258,9 @@ def _without_fixed_build_path_globs(name: str, text: str) -> str: continue for value in ast.walk(node.value): if isinstance(value, ast.Constant) and isinstance(value.value, str) and value.value in safe and value.lineno == value.end_lineno: - line = lines[value.lineno - 1] - lines[value.lineno - 1] = line[:value.col_offset] + '""' + " " * (value.end_col_offset - value.col_offset - 2) + line[value.end_col_offset:] + line = lines[value.lineno - 1].encode("utf-8") + replacement = b'""' + b" " * (value.end_col_offset - value.col_offset - 2) + lines[value.lineno - 1] = (line[:value.col_offset] + replacement + line[value.end_col_offset:]).decode("utf-8") return "".join(lines) @@ -417,6 +418,12 @@ def _selftest() -> None: "_PRIVATE_RELEASE_PATH_GLOBS = (" + repr(session_fixture) + ",)"): assert "codex-session-artifact-path" in public_privacy_findings("src/release_build.py", leaking) assert "codex-session-artifact-path" in public_privacy_findings("src/release_manager.py", policy) + for count in (0, 1, 2, 5, 8, 16): + prefix = repr("字" * count) + ", " + unicode_policy = policy.replace("= (", "= (" + prefix) + assert not public_privacy_findings("src/release_build.py", unicode_policy) + leaking = unicode_policy.rstrip().removesuffix(",)") + ", " + repr(session_fixture) + ",)\n" + assert "codex-session-artifact-path" in public_privacy_findings("src/release_build.py", leaking) actor_fixture = joined( "if str(actor).lower() not in {", repr("owner-one"), ", ", repr("owner-two"), "}:\n raise PermissionError()\n"