Release train

v0.30.0
planbuilduploadgatetagpublishverify
23:47 · +2h43 tag window opens 21:00 Fri (working day) · est. to ready 41m (Welford p50 · n=9)

Pre-flight check-release-ready.sh 34 rows · 31 ok · 2 warn · 1 bad · 21:04

branch
working tree
venv python
sidecar venv python
CI status
ci streak
release streak
publish gate
shippable diff
pre-bump consistency
CHANGELOG entry
CHANGELOG body
README changelog
man page .TH
pbxproj MARKETING
doc surfaces
dependency drift
dependency majors
providers live
ruff
Apple Distribution
Developer ID
installer cert
provisioning profile
ASC config
ASC private key
SIGN_IDENTITY
skip-worktree
copr token
copr auth
tap workflow
git tag
publish hold
.ship-local.conf

Build build-all.sh step 6 of 9 · 1h52 elapsed · est. 14m left

1Pre-flight
1m 1cSwift unit suite
6m 2Sidecar FVPP · fetch · build · sign · 224 Mach-O, no holes
31m 2aBundle self-test
2m 2bSupply-chain inventory · 116 rows · drift: last build
0m 2cApp Store string scan
0m 2dAgent extension (.mcpb)
1m 5Xcode archive
19m 6Export → .pkg
5m… 7Release-binary scan
~2m 8Provisioning profile
~0m 9Notarisation
~13m

Gate ci.yml on main @ da82dc6b strict-macos: dispatch · run 33 907 4xx · 14m

3.103.113.123.133.14 ubuntu
✓
✓
✓
✓
✓
macos
–
–
✓
✓
…
windows
–
–
✓
–
–
strict mac
–
–
…
–
–
ruff0
inventory4481
gate-policy
gate-proofs14
ratchet14>13
manpage
mypy149=149
frontend207.7k
e2e2 browsers

Ratchets docs/testing/ratchet.json a number that may not rise

mypy errors149 / 149
gates without proof14 / 13
pytest skip sites23 / 23
slow-marked7 / 7
e2e allowlist4 / 4
IRREVERSIBLE — the tag push

Tag v0.30.0 not yet · waits on: strict mac · ratchet · TestFlight processed · 21:00 working-day window

tag == HEAD
not on PyPI
strict CI verdict
ratchet
TF processed
bank holiday? no
TestFlightby hand · 1/9
upload-testflight.sh → altool --wait → ASC processing
build0.30.0 (3070)stateuploaded 23:31 · PROCESSING (typ. 12–40m)probe
90d from upload
90d
Developer-ID .dmgby hand · 2/9
build-dmg.sh → check-dmg-shippable → upload-dmg.sh (atomic swap)
current0.29.1 · 18d leftnextafter .pkg export · notarise separatelyprobe
30d from build
18d
PyPItag · 3/9
release.yml: ci → build → publish (Trusted Publishing, attest)
live0.29.1expect+23–25m after tag · CDN-cached index, confirm on version URLprobe
permanent
∞
GitHub Releasetag · 4/9
same run · auto notes + sdist/wheel/SBOM assets
livev0.29.1expectwith PyPIprobe
permanent
∞
Homebrewtag · 5/9
repository-dispatch → homebrew-bristlenose update-formula
live0.29.1expectafter PyPI · tap trust is per-invocationprobe
permanent
∞
Fedora Coprtag · 6/9
trigger-copr, needs: verify-pypi · Source0 re-asks a 404 for 10m
live0.29.1 · f43 x86_64expect~35m · SRPM arch varies · repodata is the truthprobe
token 23 Feb 2027
171d
Snapdispatch · 7/9
snap.yml --ref vX.Y.Z → latest/stable · canonical/action-publish (node24)
edge0.29.1+git.30483d1 r14stable0.29.1 r13probe
amd64 only
—
Websiteby hand · 8/9
build.py + rsync assets + deploy.sh (SSH agent)
changelogreads CHANGELOG.md live.dmg link0.29.1probe
—

Verify release.sh verify probes are tri-state: ok · pending · bad — never derived

TestFlight

Events run dir · events.jsonl append-only · tail

23:31:02 ok   upload-testflight  altool --upload-package --wait · 644 MB · 3m41
23:31:09 …    upload-testflight  --build-status 3070 → PROCESSING (probe 1/9, window 40m)
23:33:40 ok   ci                 strict-macos dispatched on da82dc6b
23:40:12 bad  ci.ratchet         gates_without_proof 14 > 13 — check-providers-live has no proof
23:45:55 warn build-all 2b       inventory describes the LAST sidecar build (pyproject newer than pyvenv.cfg)
23:47:01 …    build-all 6        export → .pkg (est 6m, Welford p50 n=9)

Activity per-minute events · last 3h effort, not just state

21:0422:0023:00now