Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

Goal 3 Completion Audit

Audit date: 2026-08-09; Windows continuation update: 2026-08-10 Audited code revision: frozen pre-docs Windows source revision recorded in docs/GOAL3_STATUS.md

This ledger preserves the original Goal 3 audit against e850deb, bounded multi-profile signing at a339fff, protected signed-log transport at 43b4476, and selectable signed products at 2e0773a, then updates the Windows durable-control-plane rows. The continuation remains on the dedicated Goal 3 branch. Local/native gates pass; Windows GitHub-live, signed, and device acceptance remain pending.

Status meanings:

  • Proven — directly established by inspected current-tree artifacts or a cited live run.
  • Implemented-unproven — implementation and usually tests exist, but the required real provider, Apple account, signing identity, host, or device path has not run successfully.
  • Missing — required product behavior or evidence is absent.
  • Contradicted — current state directly conflicts with the stated requirement.

Unit, integration, synthetic signing, and mocked-provider tests prove deterministic code behavior only. They are not counted as live GitHub, Apple, SSH-host, signing, or physical-device proof. The app/Widget/Live Activity profile continuation is therefore recorded only as implemented-unproven until its live signing gates pass.

Windows continuation verification

GateResult
cargo-ferry139 library, 235 binary, 11 jobs CLI; all passed
Managed artifacts12 module and 9 CLI; all passed
GitHub provider316 passed, 1 explicit live test ignored; strict Clippy passed
IDE/VS CodeRust black-box 4 passed; live TypeScript 74 passed/8 skipped; identical schema SHA-256 DAC218CBCE888ACF6079E4DF304452D22990CE0DB81EDB5382549198255DB270
Strict gatesall-target check, Clippy with -D warnings, formatting, diff hygiene, and independent P0–P2 reviews passed
Live evidenceNo Windows-originated GitHub run, GitSnapshot, cancellation, retry, signed artifact, or device result

Historical local verification at 2e0773a

CheckResult
Affected all-target testsPass: cargo-ferry 42 library, 112 binary, 52 CLI, 1 log-stream integration, and 1 doctest; Apple 47 library passed/1 ignored, 9 device passed/3 ignored, 2 golden passed, and 4 Xcode smoke ignored; GitHub 140; remote 42 library plus all integration suites and 4 doctests; worker 81 library and 27 binary
Strict ClippyPass with -D warnings for cargo-ferry, Apple, GitHub, remote, and worker, all targets
Formatting and patch hygienecargo fmt --all -- --check and git diff --check pass
Generated workflowsModern generated YAML passes actionlint; the schema-v2 legacy snapshot is byte-identical
Independent reviewClean after signed-request base-contract, ZIP alias/tree/UUID, request-derived output, dSYM capability cleanup, optional-product ownership, and replacement-preservation fixes; active same-UID racing remains outside the isolated Phase B trust boundary

The current-revision full workspace/CI matrix was not rerun: the workspace volume was 99% used with about 3.1 GiB free, while the affected dependency slice was fully tested from existing caches. The historical full-workspace and cross-platform CI results below remain separate evidence.

Main 27-point definition of done

#RequirementStatusEvidence
1Linux client builds for iPhone without local macOS or XcodeProvenLive client run 31261962599 and worker run 31262066567 at 607fe78; .github/workflows/rustferry-goal3-linux-client-acceptance.yml; docs/GOAL3_STATUS.md.
2Windows client builds for iPhone without local macOS or XcodeImplemented-unprovenCross-platform routing in crates/cargo-ferry/src/commands/platform_build.rs; Windows remains partial in docs/support-matrix.md; no live Windows run.
3cargo ferry build iphone and ios --device select a remote macOS path when neededProvenRouting and non-mac default in crates/cargo-ferry/src/commands/platform_build.rs; CLI definitions in crates/cargo-ferry/src/cli.rs.
4Provider abstraction supports GitHub, SSH Mac, and local MacMissingTrait exists in crates/rustferry-remote/src/provider.rs; concrete implementations only in crates/rustferry-github/src/provider.rs and crates/rustferry-ssh/src/provider.rs; no local-mac provider.
5Remote macOS worker validates host readinessImplemented-unprovenWorker commands in crates/rustferry-worker-macos/src/main.rs; macOS/Xcode/SDK/Rust/disk/signing/profile checks in crates/rustferry-worker-macos/src/host.rs; no current signed host proof.
6Compile Rust for aarch64-apple-iosProvenLive unsigned worker run 31262066567; toolchain and target checks in crates/rustferry-worker-macos/src/host.rs; build pipeline in crates/rustferry-worker-macos/src/pipeline.rs.
7Build a real iphoneos application bundleProvenLive unsigned .xcarchive path from runs 31261962599 / 31262066567; validation recorded in docs/GOAL3_STATUS.md; pipeline in crates/rustferry-worker-macos/src/pipeline.rs.
8Produce a correctly signed .appImplemented-unprovenSigning/keychain/provisioning pipeline exists in crates/rustferry-worker-macos/src/keychain.rs, provisioning.rs, and pipeline.rs; only synthetic evidence is recorded in docs/GOAL3_STATUS.md.
9Produce a correctly signed .xcarchiveImplemented-unprovenThe worker reconstructs the archive from the exact independently validated signed IPA app tree, requires a fresh deep strict signature check, and transports it for --artifact archive|all; no real signed archive or Organizer/export proof exists.
10Export a signed .ipaImplemented-unprovenExport implementation in crates/rustferry-worker-macos/src/export.rs; docs/GOAL3_STATUS.md states real IPA export remains unvalidated.
11Validate certificate identity and requested Apple Team IDImplemented-unprovenTyped plans in crates/rustferry-remote/src/signing.rs; validation in worker signing/provisioning modules; no real certificate/account run.
12Validate provisioning profile against bundle, team, certificate, and deviceImplemented-unprovencrates/rustferry-worker-macos/src/provisioning.rs; synthetic fixtures only.
13Preserve and validate requested entitlementsImplemented-unprovencrates/rustferry-remote/src/signing.rs and worker provisioning/signing validation; no signed artifact evidence.
14Sign frameworks, extensions, and app inside-outImplemented-unprovenMulti-target plan and ordering exist in crates/rustferry-remote/src/signing.rs; bounded per-target CLI/provider/worker transport passes local integration tests, with real signing pending.
15Support distinct profiles for the app and every extensionImplemented-unprovenRepeatable exact TARGET=PATH, at most three profiles, common-device validation, static per-target secrets, and RFSIGNV2 input pass local cargo-ferry, rustferry-github, and worker tests; no live signed proof yet.
16Submit an exact clean Git revision without copying secretsProvenClean-revision source flow in crates/cargo-ferry/src/commands/remote.rs; GitHub provider in crates/rustferry-github/src/provider.rs; live unsigned run 31261962599.
17Submit an explicit deterministic source snapshotImplemented-unprovenbuild iphone --remote github --snapshot --unsigned provides zero-write preview, explicit consent, deterministic staging, durable ownership, recovery, exact worker binding, retry retention, and cleanup. Local/Windows suites pass; no GitHub-live snapshot.
18Emit structured job IDs, phases, progress, warnings, and terminal eventsImplemented-unprovenPrivate immutable jobs plus list/show/logs/artifacts/prune persist sanitized lifecycle and bounded worker events across processes. Local/Windows suites pass; no Windows live job.
19Cancel and retry remote work safelyImplemented-unprovenFresh-process cancellation, exact Git/retained GitSnapshot retry, current-source recapture, atomic lineage, and crash recovery are implemented and Windows-native tested; no live cancel/retry result.
20List and download all declared artifactsImplemented-unprovenGitHub artifact flow in crates/cargo-ferry/src/commands/remote.rs and crates/rustferry-github/src/provider.rs; run 31261962599 proves unsigned archive download, while selected signed app/archive/dSYM sets have deterministic local coverage only.
21Verify downloaded SHA-256 values before successProvenStrict artifact verification in crates/rustferry-remote/src/artifact.rs; live acceptance hash checks in .github/workflows/rustferry-goal3-linux-client-acceptance.yml.
22Reject unsafe artifact paths and archive contentsProvenPath/archive validation and limits in crates/rustferry-remote/src/artifact.rs and remote security tests.
23Emit a complete, machine-readable artifact manifest and validation reportImplemented-unprovenManifest fields and validation levels in crates/rustferry-remote/src/artifact.rs; the worker and client enforce exact request-derived records and signed-product evidence locally, but no real signed manifest exists.
24Keep credentials and signing material out of source, argv, logs, and artifactsImplemented-unprovenCentral redaction tests in crates/rustferry-remote/tests/security.rs; protected sign phase and stdin frame in .github/workflows/rustferry-goal3-iphone.yml; no live signed-secret audit.
25Install the downloaded application on a physical iPhoneImplemented-unprovenDevice install service exists under crates/cargo-ferry/src/deployment/; docs/support-matrix.md records no end-to-end downloaded signed artifact proof.
26Launch the installed application and report identity/resultImplemented-unprovenRun/device support exists under crates/rustferry-apple/src and cargo-ferry commands; no physical-device run.
27Stream physical-device logs and complete the full remote-to-device pathMissingdocs/support-matrix.md marks physical logs unsupported; no signed IPA, install, launch, or runtime-log acceptance run.

GitHub provider: 17 criteria

#CriterionStatusEvidence
1Concrete provider implements the shared remote-provider contractProvencrates/rustferry-github/src/provider.rs; contract in crates/rustferry-remote/src/provider.rs.
2GitHub is the default remote path on non-macOSProvencrates/cargo-ferry/src/commands/platform_build.rs.
3remote setup github installs provider config and workflowProvencrates/cargo-ferry/src/commands/remote.rs; generated workflow path .github/workflows/rustferry-goal3-iphone.yml.
4Setup has deterministic preview/dry-run behaviorProvenRemote setup preview/config logic in crates/cargo-ferry/src/commands/remote.rs; checked-in command tests.
5Setup completes an unsigned smoke build, download, and inspectionMissingSetup stops after installation/instructions in crates/cargo-ferry/src/commands/remote.rs; acceptance workflow is separate.
6Doctor checks authentication, repository, workflow, permissions, environment, and secretsImplemented-unprovenDoctor implementation in crates/cargo-ferry/src/commands/remote.rs; no private signed-environment run.
7Exact Git revision mode works without Apple credentialsProvenLive runs 31261962599 / 31262066567; .github/workflows/rustferry-goal3-linux-client-acceptance.yml.
8Explicit GitHub source-snapshot mode worksImplemented-unprovenExplicit public unsigned GitSnapshot route, consent, recovery, retry retention, and cleanup ownership pass local/Windows tests; no live GitHub build.
9Submission uses isolated, collision-resistant temporary refs/jobsProvenGitHub provider implementation and workflow concurrency in crates/rustferry-github/src/provider.rs and .github/workflows/rustferry-goal3-iphone.yml.
10Workflow/action/toolchain inputs are pinnedProven.github/workflows/rustferry-goal3-iphone.yml; .github/workflows/rustferry-goal3-linux-client-acceptance.yml.
11Compile phase has no signing-secret accessProvenWorkflow permissions/job separation in .github/workflows/rustferry-goal3-iphone.yml; compile job precedes protected sign job.
12Signed phase is isolated behind a protected environmentImplemented-unprovenSign job environment and secret bindings in .github/workflows/rustferry-goal3-iphone.yml; private environment protection not live-proven.
13Secret set is explicit, exact, and passed through stdinImplemented-unprovencrates/rustferry-github/src/workflow.rs derives a static application/extension profile set; the worker accepts bounded RFSIGNV2 for multiple profiles and the legacy frame only for one application. Local integration tests pass; live protected-Environment proof remains pending.
14Provider reports queue/job/phase progress and terminal errorsImplemented-unprovenDurable sanitized job events include bounded provider refresh and exact completion proof. Persistent CLI/IDE UX passes local/Windows suites; no malformed/provider-failure live run.
15Provider supports cancellation and cleanupImplemented-unprovenDurable intent, exact owned-run cancellation, GET-only restart reconciliation, and cleanup are implemented/tested; no live cancellation/cleanup-failure evidence.
16Provider downloads declared artifacts and verifies integrityProvenLive unsigned artifact path in run 31261962599; verification in crates/rustferry-remote/src/artifact.rs and acceptance workflow lines 141-158.
17Protected manual signed workflow produces a real IPAMissingCurrent workflow is temporary-ref push-triggered, not the requested manual signed acceptance; no successful signed run or IPA artifact ID.

Signed IPA: 18 criteria

#CriterionStatusEvidence
1Manual mode accepts a PKCS#12 signing certificateImplemented-unprovencrates/cargo-ferry/src/commands/signing.rs; worker sign input in crates/rustferry-worker-macos/src/main.rs.
2Certificate password is transferred without argv/log exposureImplemented-unprovenStdin-only workflow frame in .github/workflows/rustferry-goal3-iphone.yml; parser in crates/rustferry-worker-macos/src/main.rs.
3Manual mode accepts one profile for every signable targetImplemented-unprovenCargo-ferry accepts at most three exact TARGET=PATH profiles, preserves legacy PATH for a single app, requires a common device, and passes local integration tests; real profile proof remains pending.
4Secret names are deterministic, static, and target-specificImplemented-unprovencrates/rustferry-github/src/workflow.rs retains the legacy app secret and derives canonical static extension names from target identity; provider and worker integration tests pass.
5Signing plan identifies application and extension bundle IDsProvenProvisioningPlan / SigningPlan in crates/rustferry-remote/src/signing.rs.
6Team ID consistency is checked before signingImplemented-unprovenSigning/provisioning validation in crates/rustferry-remote/src/signing.rs and worker modules; synthetic evidence only.
7Profile application identifier matches each target bundle IDImplemented-unprovencrates/rustferry-worker-macos/src/provisioning.rs; no real profile run.
8Registered device and profile device coverage are validatedImplemented-unprovenDevice/profile checks in worker provisioning and remote signing models; no real device/profile evidence.
9Requested entitlements are a permitted subset of profile entitlementsImplemented-unprovenSigning-plan validation and worker provisioning logic; synthetic fixtures only.
10App Groups/keychain/shared capabilities remain consistent across targetsImplemented-unprovenMulti-target entitlement model in crates/rustferry-remote/src/signing.rs; no signed extension artifact.
11Signing uses an isolated temporary keychain and restores host stateImplemented-unprovenWorker signing/keychain implementation and cleanup paths; no real host run.
12Every target embeds its matching provisioning profileImplemented-unprovenPer-target loop in crates/rustferry-worker-macos/src/pipeline.rs and provisioning.rs; bounded named transport supplies the exact profile set in synthetic tests, but no real signed artifact exists.
13Frameworks and extensions are signed before the containing appImplemented-unprovenOrdering in remote signing model and worker pipeline; synthetic proof only.
14Final signatures and entitlements are independently verifiedImplemented-unprovenWorker signing/export validation code and artifact validation report; no real signed output.
15.xcarchive structure and metadata are validImplemented-unprovenThe selected signed archive is reconstructed from the exact validated IPA app tree and rechecked with deep strict codesign; client tree verification passes synthetic coverage, but Organizer/export and real signed-artifact proof are absent.
16Export options are derived from validated manual-signing inputsImplemented-unprovencrates/rustferry-worker-macos/src/export.rs; no real account/profile export.
17IPA, archive, manifest, validation report, and sanitized log are returnedImplemented-unprovenThe exact five-file default and request-selected signed app/archive/main-app-dSYM transports are implemented, manifest-bound, and locally tested; no protected live signing run has returned them.
18IPA installs, launches, and runs on the registered physical deviceMissingNo real signed IPA artifact, device-install run, launch run, or runtime-log run; docs/GOAL3_STATUS.md and docs/support-matrix.md.

SSH Mac provider: 13 criteria

#CriterionStatusEvidence
1CLI can add and name an SSH Mac remoteProvenRemote CLI and configuration in crates/cargo-ferry/src/cli.rs and cargo-ferry remote commands.
2Host, port, user, identity, and workspace settings are validatedImplemented-unprovenSSH config/transport in crates/rustferry-ssh; local deterministic tests only.
3Host identity is verified without insecure shell interpolationImplemented-unprovenArgument-array transport and SSH validation in crates/rustferry-ssh; no live host proof.
4Client and worker perform protocol/version/capability handshakeImplemented-unprovencrates/rustferry-ssh/src/provider.rs; no live host handshake.
5Doctor reports remote macOS/Xcode/SDK/Rust readinessImplemented-unprovenSSH doctor plus worker host checks in crates/rustferry-worker-macos/src/host.rs; local test transport only.
6Deterministic source bundle is uploaded safelyImplemented-unprovenSnapshot bundle implementation/tests and docs/remote/source-bundles.md; no live transfer.
7Remote workspace is isolated per jobImplemented-unprovenDedicated snapshot session and cleanup logic in crates/rustferry-ssh; no real concurrent host jobs.
8Remote worker performs an unsigned device archive buildImplemented-unprovenDedicated snapshot session advertises unsigned/archive capability in crates/rustferry-ssh/src/provider.rs; no live Mac.
9Shared BuildProvider.submit/events path works for SSHMissingGeneric methods return UnsupportedCapability in crates/rustferry-ssh/src/provider.rs.
10Live progress/log events are streamedMissingDedicated capability set has events but not live logs; generic events are unsupported in crates/rustferry-ssh/src/provider.rs.
11Cancellation is propagated and remote work stopsImplemented-unprovenDedicated session cancellation exists; local tests only, generic provider path incomplete.
12Signed IPA build and download work over SSHMissingSnapshot capability set is unsigned; generic artifact listing/download is unsupported in crates/rustferry-ssh/src/provider.rs; no live signed host.
13Artifact SHA verification and remote cleanup are provenImplemented-unprovenDedicated session includes download/cleanup and local deterministic tests; no live artifact transfer/cleanup evidence.

Parallel safety and integration

RequirementStatusEvidence
Baseline captured before Goal 3 workProvendocs/GOAL3_BASELINE.md records base d6887eb, baseline checks, and test counts.
Source checkout treated as read-only during isolated developmentImplemented-unprovenHistorical record in docs/GOAL3_ISOLATION.md; the wrapper is a guard, not an OS sandbox.
Goal 3 commands reject source-checkout pathsProvenscripts/goal3-run:24-49.
Goal 3 uses separate target, cache, config, artifact, and temp rootsProvenscripts/goal3-run:51-59.
Commands are recorded with operation IDsProvenscripts/goal3-run:61-95; docs/GOAL3_COMMAND_AUDIT.jsonl.
Every continuation shell command passed through the wrapperContradictedOne intermediate package test followed a wrapped command through an outer && and therefore escaped wrapper recording. It stayed in the mutable checkout, touched no source checkout, and all authoritative final tests/checks were rerun through goal3-run.
Work remains on a dedicated Goal 3 branch and never lands on main/master during Windows developmentProvenWindows continuation uses goal3/windows-live-acceptance; no automatic master merge. Historical pre-handoff local merges remain recorded separately.
Goal 3 commits consistently use the mandated goal3: prefixContradictedIntegrated commit sequence includes b32be13, 36ea042, and e850deb with conventional non-goal3: subjects.
Generated integration packages are absent from landingProvendist/goal3-integration/, dist/goal3-ssh-snapshot-v1/, and dist/goal3-multi-target-signing-v1/ were removed; /dist/goal3-*/ is ignored. Generated handoff artifacts are not product source.
SSH continuation history is retainedProvenGit history retains integration commits b32be13, 36ea042, and e850deb; no removed dist/ path is cited as current evidence.
Multi-target signing history is retainedProvenGit history retains bounded multi-target signing at a339fff and selectable signed products at 2e0773a; generated replay packages are intentionally not committed.
Historical requested local merge is recordedProvenThe handoff ancestry contains the SSH integration through e850deb, multi-target signing at a339fff, and selectable signed products at 2e0773a; Windows work continues on a dedicated branch.
Windows continuation branch is pushed to originMissingThe frozen source/workflow commits and named branch have not yet been published. master is not the development target.
Current Windows revision has CI/live acceptanceMissingFrozen local/native gates pass; no Windows-originated GitHub/macOS run or current remote CI result is recorded.

External and live blockers

These are validation blockers, not substitutes for missing implementation.

Blocker / required evidenceStatusEvidence / minimum proof needed
Private GitHub repository with protected signing environmentMissingConfigure reviewed environment and run the protected sign job; current workflow evidence is static only.
Real Apple Developer team and accepted agreementsMissingRequired for bundle/device/profile operations and signed export. No account evidence is stored.
Real certificate, password, and matching provisioning profilesMissingRequired for a live manual-signing run; synthetic fixtures do not count.
Registered physical iPhone and device UDID/profile coverageMissingRequired for install/launch/runtime acceptance.
Successful protected GitHub signed runMissingMust cite run, job, commit, environment, and retained artifact IDs.
Real signed .app, .xcarchive, .ipa, and main-app dSYM inspectionMissingMust validate signatures, embedded profiles, entitlements, nested code, manifest/SHA values, real DWARF content, and executable-to-dSYM UUID equality.
Physical install and launch evidenceMissingMust cite device, artifact SHA, install result, bundle launch result, and sanitized logs.
Live Windows client acceptanceMissingRun from Windows with no Xcode/macOS tools and cite job/artifact IDs.
Live SSH Mac acceptanceMissingRun handshake, doctor, upload, build, event stream, artifact verification, cancellation, and cleanup on a real remote Mac.
Personal Team pathMissingdocs/support-matrix.md marks it unsupported; requires separate capability and live validation.
Live app + Widget + Live Activity signed acceptanceMissingBounded per-target profile transport passes local integration tests; protected secret upload, signed artifacts, and device evidence remain absent.
Physical-device log streamingMissingSupport matrix marks it unsupported; implementation and live proof both required.

Other explicit completion gaps

RequirementStatusEvidence
Full CLI families: jobs, apple, device, artifactMissingjobs and artifact are now implemented; the specifically requested top-level apple and device families remain absent, with current Apple/device behavior exposed through signing/devices/install/run/logs commands.
Apple resource plan/apply, bundle-ID registration, and device registrationMissingNo corresponding command/client implementation; current signing models only consume existing metadata.
Reusable deterministic fake provider covering all required failuresMissingOnly protocol unsupported doubles and transport-specific fakes exist; see crates/rustferry-remote/tests/protocol.rs.
Required documentation packageMissingGitHub provider/source/security, CLI, support, status, completion audit, and the complete docs/goal3-windows/ package now exist. The broader original docs/iphone/*, docs/security/*, and requested Goal 3 ADR path inventory remains incomplete.
Required README headline and complete from-any-computer quickstartMissingREADME.md retains the existing RustFerry headline and an unsigned/source-install path.
Phase-by-phase cold/warm/cache performance ledgerMissingNo source-manifest, bundle, upload, queue, build, sign, export, download, or client-verification measurements; docs/GOAL3_STATUS.md records the gap.
Honest support/status reportingProvendocs/GOAL3_STATUS.md says DoD incomplete; docs/support-matrix.md distinguishes live, synthetic, partial, and unsupported paths.

Completion conclusion

Goal 3 is not complete. The historical Linux-to-GitHub-to-macOS unsigned archive path is live-proven. The Windows continuation completes durable jobs/history/sanitized logs/cancel/retry/prune, managed artifacts, explicit public GitSnapshot, metadata-only signing readiness, and VS Code control-plane integration with local and Windows-native evidence. It does not have a Windows-originated GitHub run, live GitSnapshot/cancel/retry result, real Apple Development signing, or physical-device evidence. Remaining product gaps include the Apple registration/resource CLI surfaces, physical-device logs, broader documentation/ADR inventory, live performance ledger, private protected signing setup, real signed artifacts, and install/launch/runtime validation. The branch must be pushed and opened as a Draft PR; no automatic master merge closes these blockers.