Skip to content

Commit 5469d34

Browse files
docs: track TestFlight publication evidence
1 parent f56b7b8 commit 5469d34

7 files changed

Lines changed: 1112 additions & 0 deletions

.github/workflows/codecov.yml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,11 @@ jobs:
3030
bash ./scripts/test-todo-debt-audit.sh
3131
bash ./scripts/audit-todo-debt.sh
3232
33+
- name: TestFlight publication evidence
34+
run: |
35+
bash ./scripts/test-testflight-publication-readiness-audit.sh
36+
bash ./scripts/audit-testflight-publication-readiness.sh
37+
3338
- name: Iroha mobile SDK release asset contract
3439
env:
3540
GH_TOKEN: ${{ github.token }}
Lines changed: 80 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,80 @@
1+
{
2+
"schemaVersion": 1,
3+
"platform": "ios",
4+
"distributionChannel": "testflight-external-public-link",
5+
"assessedAtUTC": "2026-07-26T13:26:11Z",
6+
"evidenceBoundary": {
7+
"contract": "tracked-sanitized-publication-snapshot",
8+
"observationMethod": "authenticated-app-store-connect-and-unauthenticated-public-link-in-safari",
9+
"rawAttestationsTracked": false,
10+
"rawAttestationsLocation": "ignored-build-output",
11+
"currentStateRevalidationRequired": true
12+
},
13+
"artifact": {
14+
"sourceCommit": "f56b7b896344cfded39456217097747ef9efeacf",
15+
"bundleIdentifier": "jp.co.soramitsu.fearlesswallet",
16+
"marketingVersion": "4.2.0",
17+
"buildNumber": "2026.7.26",
18+
"preUploadArchiveTreeSHA256": "301f19a4f1232fb05719d85b825ac081196fa5fb6988b58011b7569a4bd9e6fa",
19+
"executableSHA256": "cf0318792fc361bbd8704b21b6e1a08c4d81897f23492e4a807eab7f22403568",
20+
"signedArchiveAuditReceiptSHA256": "1dbf38740b38403dde9cc7d4b1710cd28fdd5dc6f6f25990a7102020f11d1abc",
21+
"preservedDataArchiveRehearsalResultSHA256": "418d22cdd9e673ddfa1f47a49c666df11a740aac6737f6ef2b0328fa1b6a8641"
22+
},
23+
"upload": {
24+
"status": "success",
25+
"uploadedAtUTC": "2026-07-26T13:16:00Z",
26+
"postUploadArchiveTreeSHA256": "a483a372fe8fd19761d3b0324427c4cf55a4553b4ed7433b34b78517f292cea7",
27+
"postUploadArchiveInfoPlistSHA256": "e82ff42b4b47713d1094c420dd7d1abfbfdfe7e7b80c972909936ad64e1e4756",
28+
"postUploadAttestationSHA256": "6ede1d8fb981be149a82d69313be0ebc1838291e27d0ecf1c1576c95350b1af9",
29+
"xcodeMutation": "Distributions-only",
30+
"reconstructedPreUploadArchiveTreeMatched": true,
31+
"embeddedAppSignatureVerified": true
32+
},
33+
"testFlight": {
34+
"processingStatus": "testing",
35+
"externalTestingActive": true,
36+
"externalGroup": {
37+
"name": "Public Beta Test",
38+
"id": "9410949d-b468-40e5-b2f4-24055e65d270",
39+
"testerCount": 122,
40+
"buildCount": 2,
41+
"containsBuild": true,
42+
"publicLinkTesterCount": 120,
43+
"publicLinkTesterLimit": 500
44+
},
45+
"publicLink": {
46+
"enabled": true,
47+
"shareableToAnyoneWithLink": true,
48+
"url": "https://testflight.apple.com/join/012KzFyD",
49+
"urlSHA256": "d6599b1b9c0f7e77d9dd80d9185da67c1d864be5df9a7bbf360f245b099a000c",
50+
"landingPageResolved": true,
51+
"landingPageApplicationName": "Fearless Wallet: DeFi Wallet",
52+
"testFlightDeepLinkPresent": true
53+
},
54+
"whatToTestSHA256": "d5d0c2063934c4ca7dd8bb82af038d79909738c93cf96c11ab63bca8c0b7f272",
55+
"automaticTesterNotification": true,
56+
"publicationAttestationSHA256": "84e53d78316cf46cc1956d04e86782241d6e575da90fef109acaaf44cb368d4c"
57+
},
58+
"symbolication": {
59+
"status": "degraded-third-party-symbolication",
60+
"runtimeInstallLaunchOrMigrationImpact": false,
61+
"mainApplicationDSYMPresent": true,
62+
"runtimeFrameworkMissingVendorDSYM": "MPQRCoreSDK.framework",
63+
"staticStubFrameworkWarnings": [
64+
"blake2lib.framework",
65+
"libed25519.framework",
66+
"sr25519lib.framework"
67+
],
68+
"productionFollowUpRequired": true
69+
},
70+
"readiness": {
71+
"status": "blocked",
72+
"publicationVerified": true,
73+
"externalTestingActive": true,
74+
"exactAppleDeliveredInstallVerified": false,
75+
"preservedDataPostInstallRehearsalVerified": false,
76+
"releaseEnabled": false,
77+
"blockerCode": "testflight-exact-build-preserved-data-install-pending",
78+
"requiredAction": "Update in place through TestFlight without deleting or clearing app data, then repeat the five-cold-launch and store-integrity rehearsal."
79+
}
80+
}

docs/release-checklist.md

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,13 @@ Use this checklist for every release PR from `develop` to `master`.
3131
- Run `bash ./scripts/test-transaction-builder-tests-audit.sh && bash ./scripts/audit-transaction-builder-tests.sh`
3232
and confirm Bitcoin, Solana, Iroha, and TON fail-closed transfer coverage
3333
remains in place.
34+
- Run
35+
`bash ./scripts/test-testflight-publication-readiness-audit.sh && bash ./scripts/audit-testflight-publication-readiness.sh`
36+
and review the exact tracked publication snapshot. Do not mark the TestFlight
37+
build release-enabled until an in-place TestFlight update preserves the
38+
existing app container, five cold launches pass, store integrity is unchanged,
39+
and the remaining third-party symbolication follow-up is closed or explicitly
40+
accepted by release review.
3441
- Run `bash ./scripts/check-iroha-mobile-sdk-release-assets.sh --self-test`.
3542
If `IROHA_MOBILE_SDK_RELEASE_TAG` is configured for the release, also run
3643
`bash ./scripts/check-iroha-mobile-sdk-release-assets.sh --download --tag "$IROHA_MOBILE_SDK_RELEASE_TAG"`.
Lines changed: 106 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,106 @@
1+
# TestFlight Publication Readiness
2+
3+
Status: **BLOCKED only on exact Apple-delivered install/rehearsal and symbolication follow-up**
4+
5+
This document records the sanitized, reviewable publication snapshot for the
6+
migration-fixed Fearless Wallet iOS build. It does not contain App Store
7+
credentials, signing secrets, wallet data, device data, or a private tester
8+
handoff.
9+
10+
## Exact Published Build
11+
12+
- Artifact source commit:
13+
`f56b7b896344cfded39456217097747ef9efeacf`.
14+
- Bundle and version:
15+
`jp.co.soramitsu.fearlesswallet`, `4.2.0 (2026.7.26)`.
16+
- Pre-upload archive tree SHA-256:
17+
`301f19a4f1232fb05719d85b825ac081196fa5fb6988b58011b7569a4bd9e6fa`.
18+
- Executable SHA-256:
19+
`cf0318792fc361bbd8704b21b6e1a08c4d81897f23492e4a807eab7f22403568`.
20+
- Signed-archive audit receipt SHA-256:
21+
`1dbf38740b38403dde9cc7d4b1710cd28fdd5dc6f6f25990a7102020f11d1abc`.
22+
- Preserved-data archive rehearsal result SHA-256:
23+
`418d22cdd9e673ddfa1f47a49c666df11a740aac6737f6ef2b0328fa1b6a8641`.
24+
25+
Xcode uploaded the exact archive successfully at `2026-07-26T13:16:00Z`.
26+
Its only archive mutation was the normal `Distributions` receipt in
27+
`Info.plist`. Removing that receipt from a copy reconstructed the pre-upload
28+
tree hash, while the embedded app signature and executable hash remained
29+
unchanged.
30+
31+
## External TestFlight State
32+
33+
The authenticated App Store Connect observation at
34+
`2026-07-26T13:26:11Z` records:
35+
36+
- `4.2.0 (2026.7.26)` is `Testing`;
37+
- external group `Public Beta Test` has stable identifier
38+
`9410949d-b468-40e5-b2f4-24055e65d270`;
39+
- the group contains the exact build and showed `122` testers, `2` builds, and
40+
`120/500` public-link places used;
41+
- automatic tester notification was enabled; and
42+
- the anyone-with-the-link URL is
43+
`https://testflight.apple.com/join/012KzFyD`.
44+
45+
An unauthenticated Safari request resolved that URL to Apple's
46+
`Fearless Wallet: DeFi Wallet` page and exposed the TestFlight deep link.
47+
Tester and build counts are a dated snapshot and can change; current App Store
48+
Connect state must be revalidated for a later production release decision.
49+
50+
## Evidence Boundary
51+
52+
The raw post-upload, publication, and physical rehearsal attestations are in
53+
ignored `build/` output. Their exact SHA-256 values are copied into the tracked
54+
manifest, but those ignored files must not be treated as canonical release source. The tracked
55+
`config/testflight-publication-readiness.json` is the sanitized public contract
56+
reviewed by the offline audit.
57+
58+
The publication snapshot proves successful upload, external testing, exact
59+
group assignment, public-link enablement, Apple landing-page resolution, and
60+
the pre-publication preserved-data archive rehearsal. It does not prove that
61+
the Apple-delivered TestFlight package has replaced the locally installed
62+
Developer App on the affected phone.
63+
64+
## Symbolication Follow-up
65+
66+
The main application dSYM is present. Xcode nevertheless warned about
67+
`MPQRCoreSDK.framework`, `blake2lib.framework`, `libed25519.framework`, and
68+
`sr25519lib.framework`.
69+
70+
The dSYM warnings cannot alter install, launch, or Core Data migration runtime
71+
behavior. The three crypto framework warnings correspond to static-stub
72+
packaging while their useful symbols are linked into the main app image.
73+
`MPQRCoreSDK.framework` is the remaining runtime framework without a matching
74+
vendor dSYM, so third-party QR crash frames can have degraded symbolication.
75+
Obtain the matching vendor dSYM or record an explicit reviewed production
76+
acceptance before marking symbolication follow-up complete.
77+
78+
## Remaining Device Gate
79+
80+
Update the existing installation through the TestFlight app on the preserved-
81+
data physical iPhone. Do not uninstall the app or clear its container. Then:
82+
83+
1. verify the installed identity is Apple/TestFlight-distributed build
84+
`4.2.0 (2026.7.26)`;
85+
2. preserve the database UUIDs, protected row counts, and semantic digest;
86+
3. run five terminate-and-cold-launch cycles with the full observation window;
87+
4. rerun SQLite `quick_check` and compare every protected fingerprint; and
88+
5. confirm there is no new Fearless crash report.
89+
90+
Until that succeeds,
91+
`exactAppleDeliveredInstallVerified=false`,
92+
`preservedDataPostInstallRehearsalVerified=false`, and
93+
`releaseEnabled=false` remain mandatory.
94+
95+
## Offline Verification
96+
97+
Run:
98+
99+
```bash
100+
bash ./scripts/test-testflight-publication-readiness-audit.sh
101+
bash ./scripts/audit-testflight-publication-readiness.sh
102+
```
103+
104+
The audit is offline. It validates a dated, content-addressed publication
105+
snapshot and deliberately does not contact Apple or infer current tester
106+
capacity from an old observation.

0 commit comments

Comments
 (0)