Skip to content

Prune archives; fix Mac upload signing and archive-based validation - #342

Merged
jlipworth merged 2 commits into
mainfrom
tooling/prune-archives
Oct 15, 2026
Merged

jlipworth merged 2 commits into
mainfrom
tooling/prune-archives

Conversation

@jlipworth

@jlipworth jlipworth commented Oct 15, 2026 •

Copy link
Copy Markdown
Owner

Archive pruning — scripts/testflight-release.py prune-archives (dry run by default, --yes deletes) and automatic pruning after a successful ship. Keeps the newest 3 archive sets that exist on App Store Connect, every set attached to an App Store version, and any set newer than the newest upload (pending/failed). Live dry run would remove the 17 never-uploaded 1.7.2 (1) archives (~1.1 GB).

Fixes found by the first real ship (1.7.2 build 1490):

  • Mac upload failed: the App Store .pkg needs the team's installer identity. The script now finds the "3rd Party Mac Developer Installer" (or Mac Installer Distribution) identity for the profile's team and sets installerSigningCertificate. A local-only export confirmed a correctly signed Labstream.pkg, and the Mac 1490 upload then succeeded.
  • validate/upload no longer require the checkout HEAD to equal the archive commit. They check the archive's own build ID: clean, matching the archive name, and on origin/main. This makes failed uploads retryable after main moves.

Verified: 22 tests in the new suite (prune policy/grouping, installer selection, slug checks, Mac export options); live validate of the 1490 set and the Mac upload; tooling suite passes except the known dv-decoder-init-probe failure; diff screened for account identifiers.

@jlipworth jlipworth changed the title Prune old release archives after shipping Prune archives; fix Mac upload signing and archive-based validation Oct 15, 2026
@jlipworth
jlipworth merged commit 52afc52 into main Oct 15, 2026
5 checks passed
@jlipworth
jlipworth deleted the tooling/prune-archives branch October 15, 2026 14:56
jlipworth added a commit that referenced this pull request Oct 16, 2026
## Summary

Makes outside pull requests cheap to review by flagging the ones that
touch essential surfaces, and says plainly that a PR may be
re-implemented rather than merged.

- `.github/triage/sensitive-paths.txt` is the single list of sensitive
paths, grouped by category: signing and entitlements, auth and
credentials, the transcode profile, dependencies, CI and release
tooling, App Store text, agent instructions (`CLAUDE.md`, `AGENTS.md`,
`.claude/`, `.codex/`), and policies.
- `scripts/check-sensitive-paths.py` lists the matching files for a PR
(`--pr N`), a branch (`--base REF`), or a list of paths. For PRs it also
checks the old path of renamed files. It is read-only and never checks
out PR code.
- The new `sensitive-paths` label has been created. Under BOT-POLICY the
bot applies it and names the matched categories, without judging whether
the change is safe. It never removes the label.
- `docs/CONTRIBUTING.md` and the PR template: PRs are proposals. The
maintainer may merge one or re-implement it with credit, and
sensitive-path changes usually get re-implemented.
- `CLAUDE.md`: before proposing to merge someone else's PR, run the
checker, report every match, and review those files line by line.

GitHub Actions is disabled for this repo, and Woodpecker has no token
that can label PRs, so the label is applied by the bot (or by hand), not
by CI.

## Linked issue

None. This is a follow-up to #348.

## Affected surface

- Platforms: none (tooling and docs)
- Backends: none

## Verification evidence

- [x] Commands run and results:
  - 5 new unit tests pass.
- `scripts/ci-hygiene.sh` passes locally: strict MkDocs build, link and
Mermaid checks, tooling tests.
- Checker on recent PRs: #346 finds nothing; #342 finds the TestFlight
script and both skill mirrors; this branch finds 5 files.
- [x] Simulator / host / device evidence: not applicable, no app code.
- [ ] Not verified (and why): the bot behavior. The bot runs on the
maintainer's own accounts.

## Privacy checklist

- [x] No tokens, client identifiers, passwords, or signing/team
identifiers.
- [x] No real server hostnames, IPs, or URLs.
- [x] No usernames, media titles, filenames, library paths, or personal
home-directory paths.
- [x] Security-sensitive changes were discussed privately first (n/a).

## AI assistance

Claude Opus via Claude Code wrote the change. The maintainer reviews it.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant