Repository navigation
[BF-FIXER] Make the version-manifest publish name its cause and write via PR (CC-202) - #327
Conversation
This comment has been minimized.
This comment has been minimized.
| Autofix run https://github.com/Simple-With-Us/CodeCaps/actions/runs/40272582547 started for `sentry[bot]`'s tagged request. Owner/sentry request: exempt from the per-bot cap (owner rule 2026-10-20). |
|
Task description is insufficient for business logic validation. 🤔 Insufficient Task ContextI found a task linked to this PR, but it only contains minimal information (title only, no description or acceptance criteria). To perform a meaningful business rules validation, I need more details. 🔍 What I need to validate:
💡 How to improve the task context:
|
…ecode, loud curl failure) - ship-testflight.sh: record_successful_ship skips the manifest publish when MARKETING/BUILD_NUM are the --upload-only '(from IPA)' placeholder, so the placeholder can no longer be written into the manifest as --version/--build. Ship-gate state is still recorded. - publish-ios-versions.sh: decode the live manifest with python3 base64 instead of 'base64 -d', which is not portable to the macos-latest ship runner. - publish-ios-versions.sh: api_request tolerates a curl transport failure and fails loudly with the named cause (method, path) instead of exiting silently under set -e before api_fail runs. Co-Authored-By: Claude Code <noreply@anthropic.com>
…he upload-only placeholder guard
|
@kody start-review |
Kody Review CompleteGreat news! 🎉 Keep up the excellent work! 🚀
|
| Options | Enabled |
|---|---|
| Bug | ✅ |
| Performance | ✅ |
| Security | ✅ |
| Business Logic | ✅ |
This does not touch CC-199 or CC-200, which stay with BF-Builder, and it is not C-102.
Summary
Makes the iOS version-manifest publish after a successful TestFlight upload explain its result and write through a pull request (CC-202).
The remote manifest
site/ios-versions.jsoninSimple-With-Us/ai-fleet-coordinatorcan no longer be updated by a direct write tomain—mainrequires a PR and the ship job'sGITHUB_TOKENiscontents:read. The publisher now uses a dedicated credential to open/reuse a branch and PR instead of failing silently with a swallowed 403.What changed
Remote publish via branch + PR —
scripts/ios-fleet/publish-ios-versions.sh:marketingVersion/build/appleId/displayNamerow into it so other apps' rows are preserved.remote-manifest-already-currentwhen the row is already current.ios-versions/<bundle>-<version>offmain, writes the merged file to that branch, then opens or reuses a PRchore: <bundle> <version>.remote-manifest-publish-skippedwhenIOS_VERSIONS_PUBLISH_TOKENis missing, explaining the ship token cannot write the other repo. All failures report asremote-manifest-publish-failedwith HTTP status and API message. Secrets are never printed.ios-app-versions.jsonrecord.Ship logging stays non-fatal but visible —
scripts/ios-fleet/ship-testflight.sh:version-manifest: ....published <bundle> <version>; failure logswarning: version-manifest publish failed (non-fatal, rc=...)without failing the already-succeeded TestFlight upload.Credential wiring —
.github/workflows/ios-ship.yml:IOS_VERSIONS_PUBLISH_TOKEN: ${{ secrets.GH_PAT }}scoped to the TestFlight ship step only. Job permissions remaincontents:read.Testing
scripts/ios-fleet/test-publish-ios-versions.shwith a stubbed GitHub API covering: PR creation on a non-mainbranch, preservation of other apps, refused write surfacing HTTP 403/message with non-zero exit, and missing-credential messaging..github/workflows/ios-ship-contract.ymlandscripts/ios-ship-workflow.test.mjscontract checks for cause-naming, PR flow, read-only permissions, and secret handling.Summary
Prevents placeholder versions from reaching the public iOS version manifest and makes manifest publish failures explicitly named.
What changed
(from IPA)placeholder for marketing/build number),record_successful_shipnow only records ship-gate state and skips the version-manifest publisher, so the IPA-carried version is not overwritten with a placeholder.--apple-id, unreachable manifest API, and unreadable live manifest content now fail with aremote-manifest-publish-failed:reason instead of a bare error/traceback. Non-numeric--apple-idis rejected early with validation.base64 -ddecoding with portable Python decoding and hardened API request handling so curl/network failures surface as a named reachability error.AGENT-SYNCtoFLEET-PROTOCOL.Verification
test-publish-ios-versions.shto assert non-numeric--apple-idexits non-zero with the named error and no traceback.ios-ship-workflow.test.mjsto assert the(from IPA)placeholder guard runs before the manifest publisher call.