Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
21 commits
Select commit Hold shift + click to select a range
62f44e6
release: true recut and semantic overlay gates v0.21.2
invalid-email-address Aug 20, 2026
9252d89
ci: publish release workflows
invalid-email-address Aug 20, 2026
0f9c367
release: prevent withdrawn renders from resurfacing
invalid-email-address Aug 20, 2026
23f87b6
feat: harden Editkin v4 workflow orchestration
invalid-email-address Aug 27, 2026
6cf5681
refactor: retire CapCut runtime for Editkin v4
invalid-email-address Aug 27, 2026
59bb9f7
feat: add Imagegen-first filter runtime
invalid-email-address Aug 27, 2026
1fac054
feat: close battle tracking review loop
invalid-email-address Aug 27, 2026
1c660a8
fix: route publishing through the outer workspace
invalid-email-address Aug 27, 2026
cf60b58
chore: sync cleanup helper and release gates
invalid-email-address Aug 27, 2026
1ec32f4
release: publish v0.23.0 cleanup and imagegen runtime
invalid-email-address Aug 27, 2026
b74b3be
release: prepare Video Autopilot v0.23.0
invalid-email-address Aug 27, 2026
eeea298
fix: make public sync receipts cross-platform stable
invalid-email-address Aug 27, 2026
8b1b851
fix: verify sync receipts across line endings
invalid-email-address Aug 27, 2026
07dd677
fix: harden updater transactions and path boundaries
invalid-email-address Aug 27, 2026
81952e9
fix: isolate explicit workspace migration
invalid-email-address Aug 27, 2026
6660e2a
fix: make release gates cross-platform
invalid-email-address Aug 27, 2026
4f46728
fix: provision clean media runners
invalid-email-address Aug 27, 2026
37c57eb
fix: harden cross-platform release verification
invalid-email-address Aug 27, 2026
f9e3c70
fix: quote CI immutability probe
invalid-email-address Aug 27, 2026
12ff42d
fix: canonicalize aliased install roots
invalid-email-address Aug 27, 2026
74041fc
fix: canonicalize interruption fixture paths
invalid-email-address Aug 27, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
89 changes: 89 additions & 0 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,89 @@
name: CI

on:
push:
pull_request:

permissions:
contents: read

env:
PYTHONUTF8: '1'
PYTHONIOENCODING: 'utf-8'

jobs:
verify:
strategy:
fail-fast: false
matrix:
os: [ubuntu-latest, windows-latest, macos-latest]
python-version: ['3.9', '3.12']
runs-on: ${{ matrix.os }}
steps:
- uses: actions/checkout@11d5960a326750d5838078e36cf38b85af677262 # v4.4.0
- uses: actions/setup-python@a26af69be951a213d495a4c3e4e4022e16d87065 # v5.6.0
with:
python-version: ${{ matrix.python-version }}
- name: Install ffmpeg runtime (Linux)
if: runner.os == 'Linux'
run: sudo apt-get update && sudo apt-get install --no-install-recommends -y ffmpeg fonts-noto-cjk
- name: Install ffmpeg runtime (macOS)
if: runner.os == 'macOS'
run: brew install ffmpeg
- name: Install ffmpeg runtime (Windows)
if: runner.os == 'Windows'
run: choco install ffmpeg --yes --no-progress
- name: Install verified media runtime
run: python -m pip install -r requirements-media.txt
- name: Validate runtime and UTF-8 output
run: python -c "import codecs,cv2,numpy,PIL,shutil,sys; sys.path.insert(0,'src'); import platform_compat; assert codecs.lookup(sys.stdout.encoding).name == 'utf-8'; assert shutil.which('ffmpeg') and shutil.which('ffprobe'); assert platform_compat.find_cjk_font(); assert hasattr(cv2,'TrackerCSRT_create') or hasattr(getattr(cv2,'legacy',None),'TrackerCSRT_create'); print('media runtime + CJK font + UTF-8 output GREEN — 中文')"
- name: Compile release tools
run: python -m py_compile install_or_upgrade.py scripts/public_privacy_gate.py scripts/public_privacy_legacy.py scripts/public_privacy_profiles.py scripts/public_privacy_references.py scripts/public_privacy_sanitizer.py scripts/public_privacy_sources.py scripts/public_skill_skeleton.py scripts/public_sync_inventory.py scripts/public_sync_renderers.py scripts/public_sync_support.py scripts/public_sync_transforms.py scripts/sync_canonical.py src/release_integrity.py src/release_manager.py src/release_manager_selftest.py src/system_health.py src/publish_hub_cli.py src/tracked_graphics_presentation.py src/tracked_graphics_render.py src/longform_maker/shorts_gate_validation.py
- name: Validate public privacy boundary
run: |
python scripts/public_skill_skeleton.py
python scripts/public_privacy_sanitizer.py --self-test --repository .
python scripts/public_privacy_gate.py --self-test --repository .
python scripts/sync_canonical.py --self-test
python scripts/sync_canonical.py --verify-receipt --repository .
- name: Validate bundled cleanup helper
run: python tools/code-cleanup-helper/scripts/self_test.py
- name: Validate documentation and evidence ranges
run: |
python tools/code-cleanup-helper/scripts/check_links.py . --config audit.config.json
python tools/code-cleanup-helper/scripts/check_drift.py . --config audit.config.json
- name: Validate architecture
run: python src/architecture_gate.py audit
- name: Quick health
run: python src/system_health.py --quick
- name: Validate gates did not mutate the source tree
run: >-
python -c "import subprocess; dirty=subprocess.check_output(['git','status','--porcelain','--untracked-files=all'],text=True,encoding='utf-8',errors='replace'); relative=[row[3:] for row in dirty.splitlines()]; assert not relative, 'validation mutated repository-relative paths: '+', '.join(relative); print('source tree immutable GREEN')"
- name: Release transaction self-test
run: python src/release_manager.py selftest
- name: Validate public Codex Skill
run: |
python -c "import pathlib,re; text=pathlib.Path('codex-skill/video-autopilot/SKILL.md').read_text(encoding='utf-8'); match=re.match(r'^---\n(.*?)\n---\n',text,re.S); assert match and 'name: video-autopilot' in match.group(1) and 'description:' in match.group(1); print('public Skill frontmatter GREEN')"

reproducible-release:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@11d5960a326750d5838078e36cf38b85af677262 # v4.4.0
- uses: actions/setup-python@a26af69be951a213d495a4c3e4e4022e16d87065 # v5.6.0
with:
python-version: '3.12'
- name: Validate release tree before reproducibility check
run: |
python scripts/public_skill_skeleton.py
python scripts/public_privacy_sanitizer.py --self-test --repository .
python scripts/public_privacy_gate.py --self-test --repository .
python scripts/sync_canonical.py --self-test
python scripts/sync_canonical.py --verify-receipt --repository .
python tools/code-cleanup-helper/scripts/check_links.py . --config audit.config.json
python tools/code-cleanup-helper/scripts/check_drift.py . --config audit.config.json
python src/architecture_gate.py audit
- name: Build twice
run: |
python src/release_manager.py build --dist "$RUNNER_TEMP/a"
python src/release_manager.py build --dist "$RUNNER_TEMP/b"
cmp "$RUNNER_TEMP/a"/*.zip "$RUNNER_TEMP/b"/*.zip
81 changes: 81 additions & 0 deletions .github/workflows/release.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,81 @@
name: Release

on:
push:
tags:
- 'v*.*.*'

permissions:
contents: write

concurrency:
group: release-${{ github.ref }}
cancel-in-progress: false

env:
PYTHONUTF8: '1'
PYTHONIOENCODING: 'utf-8'

jobs:
release:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@11d5960a326750d5838078e36cf38b85af677262 # v4.4.0
with:
fetch-depth: 0
persist-credentials: false
- uses: actions/setup-python@a26af69be951a213d495a4c3e4e4022e16d87065 # v5.6.0
with:
python-version: '3.12'
- name: Install ffmpeg runtime
run: sudo apt-get update && sudo apt-get install --no-install-recommends -y ffmpeg fonts-noto-cjk
- name: Install verified media runtime
run: python -m pip install -r requirements-media.txt
- name: Validate runtime and UTF-8 output
run: python -c "import codecs,cv2,numpy,PIL,shutil,sys; sys.path.insert(0,'src'); import platform_compat; assert codecs.lookup(sys.stdout.encoding).name == 'utf-8'; assert shutil.which('ffmpeg') and shutil.which('ffprobe'); assert platform_compat.find_cjk_font(); assert hasattr(cv2,'TrackerCSRT_create') or hasattr(getattr(cv2,'legacy',None),'TrackerCSRT_create'); print('media runtime + CJK font + UTF-8 output GREEN — 中文')"
- name: Require the exact remote main commit
shell: bash
run: |
git fetch origin main --no-tags
test "$(git rev-parse HEAD)" = "$(git rev-parse origin/main)"
- name: Verify tag matches manifest
shell: python
run: |
import json, os
manifest = json.load(open('release-manifest.json', encoding='utf-8'))
tag = os.environ['GITHUB_REF_NAME']
expected = f"v{manifest['version']}"
if tag != expected:
raise SystemExit(f"tag {tag} != expected {expected}")
- name: Run release gates
run: |
python -m py_compile install_or_upgrade.py scripts/public_privacy_gate.py scripts/public_privacy_legacy.py scripts/public_privacy_profiles.py scripts/public_privacy_references.py scripts/public_privacy_sanitizer.py scripts/public_privacy_sources.py scripts/public_skill_skeleton.py scripts/public_sync_inventory.py scripts/public_sync_renderers.py scripts/public_sync_support.py scripts/public_sync_transforms.py scripts/sync_canonical.py src/release_integrity.py src/release_manager.py src/release_manager_selftest.py src/system_health.py
python scripts/public_skill_skeleton.py
python scripts/public_privacy_sanitizer.py --self-test --repository .
python scripts/public_privacy_gate.py --self-test --repository .
python scripts/sync_canonical.py --self-test
python scripts/sync_canonical.py --verify-receipt --repository .
python tools/code-cleanup-helper/scripts/self_test.py
python tools/code-cleanup-helper/scripts/check_links.py . --config audit.config.json
python tools/code-cleanup-helper/scripts/check_drift.py . --config audit.config.json
python src/architecture_gate.py audit
python src/system_health.py --quick
python src/release_manager.py selftest
- name: Build and verify immutable assets
shell: bash
run: |
python src/release_manager.py build --base-url "https://github.com/${GITHUB_REPOSITORY}/releases/download/${GITHUB_REF_NAME}"
python src/release_manager.py build --dist "$RUNNER_TEMP/repro"
cmp dist/video-autopilot-kit-*.zip "$RUNNER_TEMP/repro"/video-autopilot-kit-*.zip
cd dist
sha256sum --check video-autopilot-kit-*.zip.sha256
- name: Publish GitHub release assets
uses: softprops/action-gh-release@3bb12739c298aeb8a4eeaf626c5b8d85266b0e65 # v2.6.2
with:
generate_release_notes: true
fail_on_unmatched_files: true
files: |
dist/video-autopilot-kit-*.zip
dist/video-autopilot-kit-*.zip.sha256
dist/release-channel.json
install_or_upgrade.py
1 change: 0 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,6 @@ dist-release-*/
dist-v*/
reports/
.rd/
.github/
data/

# ── 媒體 / 素材(版權 + 體積,絕不入庫)──
Expand Down
18 changes: 18 additions & 0 deletions 00_發布中樞_從這裡開始.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
# 發布中樞|專案唯一成片入口

> 發布索引屬於本機工作資料,第一次使用或索引不存在時按需生成;不會隨 Git clone 附帶。

## 建立/更新發布中樞

```powershell
python "src/publish_hub.py" sync
```

## 開啟與檢查

```powershell
python "src/publish_hub.py" open
python "src/publish_hub.py" audit
```

`_out/current.mp4` 是工作主檔;QA 綠燈後由上述 sync 建立唯一發布包與本機索引。
Loading
Loading